题意:
括号匹配, 按以下规则:
1. 若字符串为空, 则正确.
2. 若 A、B 皆正确, 则 AB 也正确.
3. 若 A 正确, 则 (A) 与 [A] 都正确.
即要求括号与中括号都要匹配.
思路:
使用栈, 如果当前字符与栈顶字符匹配(必须先进去的是左括号,外面的是右括号才算是匹配的):
1. 当前字符为 ')', 栈顶字符为 '(';
2. 当前字符为 ']', 栈顶字符为 '[';
则将栈顶字符出栈, 否则将当前字符入栈; 直至所有字符都操作完成, 若栈为空, 则整个字符串正确, 否则不正确.
要点:
当 stack 为空时, 调用 top 会返回段错误.
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cctype>
#include<iterator>
#include<assert.h>
#include<stack>
using namespace std;
//判断字符是否为括号的一部分()[]
bool isParenthese(char c){
return (c == '(') ||
(c == ')') ||
(c == '[') ||
(c == ']') ;
}
//判断两个char是否匹配,如(),[]
//必须是先进去的是左括号,外面的是右括号才算是匹配
bool isMatch(char left, char right){
return (left == '(' && right == ')') ||
(left == '[' && right == ']');
}
//判断c与stk的top是否匹配
bool isMatchTop(const stack<char>& stk, char c){
if(stk.empty()) return false;
return isMatch(stk.top(), c);
}
//判断一行是否正确,类似后缀表达式运算,用一个栈来存储
//当前字符与栈顶匹配时,就把栈顶出栈,否则把当前字符出栈
bool isCorrect(const string& line)
{
stack<char> stk;
for(int i = 0; i <line.size(); i++){
if(!isParenthese(line[i])) return false;
if(isMatchTop(stk, line[i])){
stk.pop();
}else{
stk.push(line[i]);
}
}
//若为空,则说明匹配
return stk.empty();
}
int main()
{
int numCase;
cin >> numCase;
cin.ignore();
string line;
while(numCase--) {
getline(cin, line);
if(isCorrect(line)){
cout << "Yes" <<endl;
}else {
cout << "No" <<endl;
}
}
return 0;
}