7-19 括号匹配
给定仅包含“()[]{}”六种括号的字符串,请你判断该字符串中,括号的匹配是否是合法的,也就是对应括号的数量、嵌套顺序完全正确。
输入格式:
第一行一个整数T(T<=10)
其后T行每行一个字符串只包含[{()}]六种字符(字符串长度2e5以内)
输出格式:
对于每个字符串,匹配输出Yes,否则输出No
输入样例:
2
{()[]}
([)]
输出样例:
Yes
No
#include <iostream>
#include <stack>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
string str;
cin >> str;
stack<char> s;
bool isValid = true;
for (char c : str) {
if (c == '(')
s.push(')');
else if (c == '[')
s.push(']');
else if (c == '{')
s.push('}');
else if (s.empty() || s.top() != c) {
isValid = false;
break;
} else {
s.pop();
}
}
if (!s.empty()) isValid = false;
if (isValid) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
总结
这是一个利用栈来判断括号匹配的问题。我们遍历给定的字符串 str,遇到左括号就push对应右括号到栈,遇到右括号就pop栈顶元素与之比较。
如果:
- 栈为空而遇到右括号,说明不匹配,isValid 设为 false。
- pop出的元素与右括号不匹配,说明不合法,isValid 设为 false。
- 遍历结束后栈不为空,说明左括号过多,不合法,isValid 设为 false。如果全部括号匹配,最后isValid仍为true,则输出"Yes",否则输出"No"。