作者 刘昆
单位 中国矿业大学徐海学院
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出 YES
,而输入([]),([)]都应该输出 NO
。
输入格式:
第一行为一个整数 n,表示以下有多少个由括号组成的字符串。接下来的 n 行,每行都是一个由括号组成的长度不超过 255 的字符串。
输出格式:
输出有 n 行,每行都是 YES
或 NO
。
输入样例:
在这里给出一组输入。例如:
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
输出样例:
在这里给出相应的输出。例如:
YES
YES
YES
YES
NO
#include<iostream>
#include<unordered_map>
#include<string.h>
using namespace std;
const int N=300;
char stk[N];
int tt=0;
int main()
{
int n;
cin >> n;
unordered_map<char,int> pr{{'<',1},{'(',2},{'[',3},{'{',4}};
while(n--)
{
tt=0;
char op[N];
cin >> op;
int m;
char x;
m=strlen(op);
int i;
bool flag = true;
for(i=0;i<m;i++)
{
if(op[i]=='{' || op[i]=='<' || op[i]=='[' || op[i]=='(')
{
stk[++tt]=op[i];
int j;
for(j=tt;j>0;j--){
if(pr[stk[tt]] > pr[stk[j]])
{
cout << "NO" << endl;
flag = false;
break;
}
}
if(flag == false)
break;
}
else if(op[i]=='}')
{
x=stk[tt];
tt--;
if(x != '{')
{
cout << "NO"<< endl;
flag = false;
break;
}
}
else if(op[i]==']')
{
x=stk[tt];
tt--;
if(x!='[')
{
cout << "NO" << endl;
flag = false;
break;
}
}
else if(op[i]==')')
{
x=stk[tt];
tt--;
if(x!='(')
{
cout << "NO" << endl;
flag = false;
break;
}
}
else{
x=stk[tt];
tt--;
if(x!='<')
{
cout << "NO" << endl;
flag = false;
break;
}
}
}
if(flag){
if(tt > 0)
{
cout << "NO" << endl;
}
if(tt == 0)
{
cout << "YES" << endl;
}
}
}
return 0;
}
注意:
1.在for前面加一个变量判断,如果输出NO才进行第二个break,不然的话都会走第二个break.
2.应该把flag放在for前面,中间输出NO,然后break跳出for循环,但是for循环下面还有代码会继续执行,如果不满足条件可能还会输出No。