我傻了我
基本思路就是一个stack的出入栈,没啥好说。主要是“empty string”这个条件把我搞到了。
因为要判断空字符串,所以我在string s; cin>>s读入之后先string.empty()判断一下。
是的,你没有看错,我居然妄图一个回车读入空字符串……
总之前面不管有多少空白字符,后面没有非空白字符,那么这一行,把回车按穿,也不会读入string中。
解决方案:
使用getline读取一整行(回车前的所有字符),可以实现读取空字符串""的操作。
辅以stringstream进行读写操作。
AC代码:
#include <iostream>
#include <string>
#include <stack>
#include <sstream>//stringstream所在
using namespace std;
int ID(const char c){
int ans;
switch (c) {
case '(':ans=0;break;
case ')':ans=1;break;
case '[':ans=2;break;
case ']':ans=3;break;
}
return ans;
}
int main(){
int n;
cin>>n;
getchar();
while (n--){
bool ans= true;
stack<int>s;
string line;
getline(cin,line);
//可能有空字符串
if(line.empty()){
cout<<"Yes"<<"\n";
continue;
}
stringstream ss(line);
char ch;
while(ss>>ch){
int a= ID(ch);
if(a&1){
if(s.empty()){
ans= false;
break;
}
int b=s.top();
s.pop();
if(a-b!=1){
ans= false;
break;
}
}else s.push(a);
}
if(!s.empty()) ans= false;
if(ans){
cout<<"Yes"<<"\n";
}else cout<<"No"<<"\n";
}
return 0;
}