——by A Code Rabbit
Description
输入一个只含有 ‘(’ 、‘)’ 、‘[’ 、‘]’ 的序列,判断并输出括号是否匹配。
Types
Date Structure :: Lists
Analysis
经典的括号匹配问题,用一个栈来存放括号。左括号则入栈,右括号则出栈。
匹配会有几种情况:
- 缺少括号。
- 多余括号。
- 括号匹配错误。
- 括号要出栈时,栈已经为空。
- 序列读完后,栈不为空。
- 括号要出栈时,栈顶元素不是要出栈的括号。
Solution
// UVaOJ 673
// Parentheses Balance
// by A Code Rabbit
#include <iostream>
#include <stack>
#include <string>
using namespace std;
enum Parentheses {
BRACKET,
PARENTHESIS,
};
string str;
int n;
stack<Parentheses> parentheses;
bool isYes;
int main() {
cin >> n;
cin.get();
while (n--) {
// Clear stack.
while (!parentheses.empty()) {
parentheses.pop();
}
// Operating.
getline(cin, str);
isYes = true;
for (int i = 0; i < str.length(); ++i) {
if (str[i] == '(') {
parentheses.push(PARENTHESIS);
} else
if (str[i] == '[') {
parentheses.push(BRACKET);
} else
if (str[i] == ')') {
if (parentheses.empty() || parentheses.top() != PARENTHESIS) {
isYes = false;
break;
} else {
parentheses.pop();
}
} else
if (str[i] == ']') {
if (parentheses.empty() || parentheses.top() != BRACKET) {
isYes = false;
break;
} else {
parentheses.pop();
}
}
}
// Judge and Output the answer.
if (!parentheses.empty()) {
isYes = false;
}
if (isYes) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
return 0;
}
参考资料:无