给定仅包含“()[]{}”六种括号的字符串,请你判断该字符串中,括号的匹配是否是合法的,也就是对应括号的数量、嵌套顺序完全正确。
输入格式:
第一行一个整数T(T<=10)
其后T行每行一个字符串只包含[{()}]六种字符(字符串长度2e5以内)
输出格式:
对于每个字符串,匹配输出Yes,否则输出No
输入样例:
2
{()[]}
([)]
输出样例:
Yes
No
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <bits/stdc++.h>
using namespace std;
// 判断括号是否匹配的函数
bool isValid(string s) {
stack<char> st;
// 遍历字符串
for (char c : s) {
// 如果是左括号,则压入栈
if (c == '(' || c == '[' || c == '{') {
st.push(c);
} else {
// 如果是右括号,检查栈是否为空
if (st.empty()) return false;
// 检查栈顶元素与当前右括号是否匹配
if ((c == ')' && st.top() == '(') ||
(c == ']' && st.top() == '[') ||
(c == '}' && st.top() == '{')) {
// 匹配成功,弹出栈顶元素
st.pop();
} else {
// 不匹配,返回 false
return false;
}
}
}
// 最后检查栈是否为空
return st.empty();
}
int main() {
int T;
cin >> T;
cin.ignore(); // 忽略换行符
while (T--) {
string s;
getline(cin, s);
if (isValid(s)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
return 0;
}