作者 刘昆
单位 中国矿业大学徐海学院
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出 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。