真是杂鱼呢~怎么这题都不会写阿❤。
作为栈专栏的最后一题只要做了前一题就知道这题怎么写吧,这题最优解应该是 栈 + 嵌套顺序校验
做法上如果是左括号就压栈,如果是右括号就判断是否 栈空 和 是否对应了左括号 如果不是栈空且对应了就出栈。
但是这题要求了括号大小顺序也必须遵循,而这四个括号的左括号(只压栈左括号)的ASCII值也并不是正好符合题目对应的顺序的。所以我们可以通过写一个转换函数把{转换成4然后[转换成3以此类,这样就能满足题目按照顺序的括号了,同时我们可以转换右括号也避免写太多字符,比如{是4对应右括号是-4这样后续的左右括号对应也会很方便检验。
#include <iostream>
#include <vector>
using namespace std;
int transform(char c) {
if (c == '{') return 4;
if (c == '[') return 3;
if (c == '(') return 2;
if (c == '<') return 1;
if (c == '}') return -4;
if (c == ']') return -3;
if (c == ')') return -2;
if (c == '>') return -1;
return 0;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
string s;
cin >> s;
if (s.size() % 2 != 0) {
cout << "NO\n";
continue;
}
vector<int> stac;
bool valid = true;
for (char c : s) {
int num = transform(c);
if (num > 0) {
// 左括号:检查是否违反嵌套顺序(不能比栈顶更大)
if (!stac.empty() && num > stac.back()) {
valid = false;
break;
}
stac.push_back(num);
} else {
if (stac.empty() || stac.back() != -num) {
valid = false;
break;
}
stac.pop_back();
}
}
if (valid && stac.empty()) {
cout << "YES\n";
} else {
cout << "NO\n";
}
}
return 0;
}

京公网安备 11010502036488号