括号匹配(栈)
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
1给一组包含[]()两种括号的序列,检查是否是合法的。
2如:()[],([]),[()]是合法的;()),[(),]()[,([)]是非法的。
Input:
输入包含多组测试数据,对于每组数据,输入一个只包含'[',']','(',')',四种字符的括号序列S(1<=length(S)<=100000);
Output:
对于每组数据,如果括号序列合法输出Yes,否则输出no。
Sample Input:
Sample Output:
1No
2No
3Yes解题思路:栈的运用。注意使用t.top()函数前要用t.empty()先判断是否栈空,不然会出错!AC代码:
4
5 1 #include<bits/stdc++.h>
6 2 using namespace std;
7 3 char s[100005];
8 4 int main(){
9 5 while(cin>>s){
10 6 stack<char> t;
11 7 bool flag=false;
12 8 for(int i=0;i<(int)strlen(s);++i){
13 9 if(s[i]=='[' || s[i]=='(')t.push(s[i]);
1410 else if(s[i]==')'){
1511 if(!t.empty() && t.top()=='(')t.pop();
1612 else{flag=true;break;}
1713 }
1814 else{
1915 if(!t.empty() && t.top()=='[')t.pop();
2016 else{flag=true;break;}
2117 }
2218 }
2319 if(flag)cout<<"No"<<endl;
2420 else cout<<"Yes"<<endl;
2521 }
2622 return 0;
2723 }