堆栈的应用,不是很困难
但一开始WA了一次,原因是没有考虑到“( ”(左括号后面有一个空格)这种情况。
AC代码:
#include <iostream>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main(){
stack<char> s;
int T;
string line;
cin >> T;
cin.get();
while(T--){
getline(cin,line);
bool flag = true;
while(!s.empty()) s.pop();
for (int i=0;i<line.length();i++){
if(line[i]=='['||line[i]=='(') s.push(line[i]);
else{
if(s.empty()) {flag = false;break;}
char ch = s.top();
if((line[i]==']'&&ch!='[')||(line[i]==')'&&ch!='('))
{flag = false;break;}
else s.pop();
}
}
if(flag == false || !s.empty()) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}
WA代码:
#include <iostream>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main(){
stack<char> s;
int T;
string line;
cin >> T;
while(T--){
cin >> line;
bool flag = true;
while(!s.empty()) s.pop();
for (int i=0;i<line.length();i++){
if(line[i]=='['||line[i]=='(') s.push(line[i]);
else{
if(s.empty()) {flag = false;break;}
char ch = s.top();s.pop();//这里不应该马上出栈
if((line[i]==']'&&ch!='[')||(line[i]==')'&&ch!='('))
{flag = false;break;}
}
}
if(flag == false || !s.empty()) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}