思路分析:
利用栈实现括号匹配即可。读取字符串后,遇到 ( 或 [ 则入栈; 遇到 ) ,若栈顶为( 则弹出,否则错误, ] 的处理类似。
注意点:
1. 每次看栈顶元素前,都要先判断栈空
2.每个字符串处理结束后,要看栈是否为空,如果不空,说明有剩余,则也说明匹配失败,视为错误
3.每个字符串处理前,先把栈清空,因为前一次处理可能有残留
4.注意空串的判定,题目中说明了空串为合法。因此输入的时候选择getline(cin,str) 这样可以输入空串
题解:
#include <iostream>
#include <string>
#include <stack>
using namespace std;string str;
stack<char> s;bool judge(string str){while(!s.empty()) s.pop();for(int i = 0; i < str.size(); i++){if(str[i] == '(' || str[i] == '[') s.push(str[i]);else if(str[i] == ')' && !s.empty() && s.top() == '(') s.pop();else if(str[i] == ']' && !s.empty() && s.top() == '[') s.pop();else return false;}if(!s.empty()) return false;return true;
}int main(){int n;scanf("%d\n", &n);while(n--){getline(cin, str);if(judge(str)) printf("Yes\n");else printf("No\n");}return 0;
}