登录之后查看代码,点此登录账号
/*
要求匹配的有大括号{},中括号[],小括号(),尖括号<>等。
对于每一对括号,必须先左边括号,然后右边括号;
如果有多个括号,则每种类型的左括号和右括号的个数必须相等;
对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号。
例如,{[()]},{()},{{}}为一个合法的表达式,而([{}]),{([])},[{<>}]都是非法的。
*/
// 思路: 用栈实现括号匹配、用map定义嵌套括号的优先级
#include <stack>
#include <unordered_map>
#include <iostream>
using namespace std;
unordered_map<char, int> h = {
{'{', 1},
{'[', 2},
{'(', 3},
{'<', 4},
{'}', -1},
{']', -2},
{')', -3},
{'>', -4},
};
int main()
{
int n;
cin >> n;
string op;
while (n--)
{
cin >> op;
stack<char> stk;
for (char c : op)
{
if (!stk.size() || h[c] >= h[stk.top()])
stk.push(c);
else if (h[c] < 0 && h[c] + h[stk.top()] == 0) // 匹配成功
stk.pop();
else
break;
}
cout << (stk.empty() ? "YES" : "NO") << endl;
// 清空栈
while (stk.size())
stk.pop();
}
return 0;
}