括号匹配检测
假设表达式中只包含三种括号:圆括号、方括号和花括号。对输入的一串由括号组成的字符串,判断其匹配情况,如([{}])或({[][()]})等均为匹配,而{[]})}或{[()]或([]}均为不匹配;若括号可以成功匹配,则输出yes,否则输出no。
输入格式:
测试数据有多组,第一行包含一个整数T(1≤T≤100),表示测试字符串的数量。
对于每组测试,输入一个由圆、方、花括号符构成的字符串(长度不超过30)。
输出格式:
对于每组测试,若括号可以成功匹配,则输出yes,否则输出no。
输入样例:
4
({})
{{}}
({[]})
}{
输出样例:
yes
yes
yes
no
注意:本题易错点
1.stack() 应该在 for 循环里面定义,否则需要每次循环清空一次
2.cin >> T 之后一定要有 getchar(), 要不然第一次 getline() 的结果为空串,反映到结果会是这样
// 2024/12/29 OK
#include <iostream>
#include <stack>
using namespace std;
int main()
{
int T;
cin >> T;
getchar();
for (int i = 1; i <= T; i ++) {
//cout << "The " << i << " loop" << endl;
int flag = 0;
stack<char> t;
string s;
getline(cin, s);
int size = s.size();
for (int j = 0; j < size; j ++) {
if (s[j] == '(' || s[j] == '[' || s[j] == '{') {
t.push(s[j]);
} else {
if (!t.empty()) {
if (!(s[j] == ')' && t.top() == '(' || s[j] == ']' && t.top() == '[' || s[j] == '}' && t.top() == '{'))
{
flag = 1;
break;
} else {
t.pop();
}
} else {
flag = 1;
break;
}
}
}
if (!t.empty()) flag = 1;
if (!flag) {
cout << "yes" << endl;
} else {
cout << "no" << endl;
}
}
return 0;
}