题目信息:
有一行括号序列,请你检查这行括号是否配对。数据保证S中只含有‘[’,‘]’,‘(’,‘)’四种字符。
如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No。
题目链接——南洋理工_2(括号匹配)
题目分析:
/***************************************************************
括号匹配问题;if('['||'(')进栈if(')')判断栈头元素if('('),出栈
继续,else:错误;需要注意特殊数据如:"))]" , "[]]"
***************************************************************/
源代码如下:
#include<iostream>
#include<stack>//栈头文件
using namespace std;
int main()
{
int i,n;
cin>>n;
while(n--){
string s;
cin>>s;
stack<char> a;//定义栈
int ok=1;
if(s[0]==']'||s[0]==')')//肯定错误
cout<<"No"<<endl;
else{
for(i=0;i<s.size();i++){
switch(s[i]){
case ')':
if(a.size()!=0&&a.top()=='('){ a.pop();}
//比较(相等)和出栈
else ok=0;//错误
break;
case ']':
if(a.size()!=0&&a.top()=='['){ a.pop();}
//比较(相等)和出栈
else ok=0;//错误
break;
default :
a.push(s[i]);break;//进栈
}
if(!ok) break;//结束以下比较
}
if(ok&&i==s.size()) cout<<"Yes"<<endl;
/**ok=1表示匹配成功或者前期比较成功之后只有进栈元素
(例:"[]]]" , "()])")用i==s.size()剔除第二种情况**/
else cout<<"No"<<endl;
}
}
return 0;
}