给出一串序列,仅包含 ( ) [ ] ,判断其是否合法,规则如下:
1.空序列合法
2.若A合法,B合法,则AB也合法
3.若A合法,则(A),[A]也合法
栈的用武之处,不过要注意空栈的判断,否则会Runtime Error
两种处理方式:
inline int F (char ch)
{
if(ch=='(') return -1;
if(ch==')') return 1;
if(ch=='[') return -2;
if(ch==']') return 2;
}
int main()
{
int T;cin>>T;getchar();
while(T--){
int ch,cc; /* [ ( ) ] */
stack<int> s; /* -2 -1 1 2 */
while((ch=getchar())!='\n')
{
ch = F(ch);
if(s.empty()) {s.push(ch);continue;}
cc = s.top();
if(cc+ch==0 && cc<ch) s.pop();
else s.push(ch);
}
if(s.empty()) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
int main() {int T; cin >> T; getchar();
while(T--) {
int ok = 1;
string s;
getline(cin ,s);
if(s.length()%2) ok = 0;
else {
stack<int> sk;
for(int i = 0; i < s.length(); i++) {
int p = _(s[i]);
if(p < 0) sk.push(p);
if(p > 0) {
if(sk.empty()) {ok = 0; break;}
if(sk.top() + p == 0) sk.pop();
else {ok = 0; break;}
}
}
if(!sk.empty()) ok = 0;
}
cout << (ok ? "Yes": "No") << endl;
}
return 0;
}