所谓带优先级,就是当出现括号的嵌套时,要求外层括号的优先级大于当前括号的优先级。
其实对于优先级的处理也比较简单,因为我们这里的栈只会存放左括号,那么我们要往栈里面加左括号时,去判断一下栈里面有没有已经存在的左括号,如果有就说明此时存在括号的嵌套,我们就可以判断一下两者的优先级。
cpp
#include <iostream>
#include <algorithm>
#include <stack>
#include <cstring>
#include <unordered_map>
using namespace std;
// 大括号 {},中括号 [],小括号 (),尖括号 <>
unordered_map<char, int> p {
{'{', 3}, {'}', 3},
{'[', 2}, {']', 2},
{'(', 1}, {')', 1},
{'<', 0}, {'>', 0},
};
bool match(char x, char y) {
return x == '{' && y == '}' ||
x == '[' && y == ']' ||
x == '(' && y == ')' ||
x == '<' && y == '>';
}
bool solve() {
string s; cin >> s;
stack<char> stk; // stk 中只会存在左括号
for(char x : s) {
if(x == '{' || x == '[' || x == '(' || x == '<') {
// 注意这里优先级可以相等
if(!stk.empty() && p[stk.top()] < p[x]) return false;
stk.push(x);
}
else {
if(stk.empty() || !match(stk.top(), x)) return false;
stk.pop();
}
}
return stk.empty();
}
int main()
{
int T;
cin >> T;
while(T -- ) {
bool flag = solve();
cout << (flag ? "YES" : "NO") << endl;
}
return 0;
}