【题目描述】
字符串中只含有括号 (),[],<>,{}
,判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{}
,例如。输入: [()]
输出:YES
,而输入([]),([)]
都应该输出NO
。
【输入】
第一行为一个整数nn,表示以下有多少个由括好组成的字符串。接下来的nn行,每行都是一个由括号组成的长度不超过255255的字符串。
【输出】
在输出文件中有nn行,每行都是YES
或NO
。
【输入样例】
5 {}{}<><>()()[][] {{}}{{}}<<>><<>>(())(())[[]][[]] {{}}{{}}<<>><<>>(())(())[[]][[]] {<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]] ><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
【输出样例】
YES YES YES YES NO
#include <iostream> using namespace std; const int N = 255; char a[N] = {0}; int main() { int n; cin >> n; char ch = cin.get();//return char //cout<<n<<":"<<ch<<endl; for (int i = 0; i < n; i++) { int jian, xiao, zhong, da, top, cnt; for (ch = jian = xiao = zhong = da = top = cnt = 0; ch != '@' && cnt < N; cnt++) {//从内到外必须是<>,(),[],{} //cin>>ch;//none space ch = cin.get(); //cout<<ch; switch (ch) { case '<': a[top++] = ch; jian++; break; case '>': jian--; //尖括号 if (a[--top] != '<') { //cout<<">:"<<a[top]<<endl; cin >> a; //remove a line ch = cin.get();//return char ch = '@'; } break; case '(': a[top++] = ch; xiao++; break; case ')': xiao--; //小括号 if (a[--top] != '(' || jian != 0) { //cout<<"):"<<a[top]<<endl; cin >> a; //remove a line ch = cin.get();//return char ch = '@'; } break; case '[': a[top++] = ch; zhong++; break; case ']': zhong--; //中括号 if (a[--top] != '[' || jian != 0 || xiao != 0) { //cout<<"]:"<<a[top]<<endl; cin >> a; //remove a line ch = cin.get();//return char ch = '@'; } break; case '{': a[top++] = ch; da++; break; case '}': da--; //大括号 if (a[--top] != '{' || jian != 0 || xiao != 0 || zhong != 0) { //cout<<"}:"<<a[top]<<endl; cin >> a; //remove a line ch = cin.get();//return char ch = '@'; } break; case '@': default: //cout<<"@:"<<ch<<endl; ch = '@'; break; } } //cout<<i<<":"<<ch<<endl; if (jian == 0 && xiao == 0 && zhong == 0 && da == 0) { cout << "YES" << endl; } else { cout << "NO" << endl; } } return 0; }