描述
现在,有一行括号序列,请你检查这行括号是否配对。
-
输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符 输出
-
3 [(]) (]) ([[]()])
样例输出
-
No No Yes
分析:
这是一道比较简单的题目,理清楚几个层次就行了。应用堆栈的思想即可解决。
1.当输入为左括号的时候,将其压入堆栈
2.只当输入的反括号时候,前面的符号和当前符号是否配对。若不配对,则输出No,配对则出栈。
3.重复上述过程,如果出现堆栈为空,导致不能出栈,说明右括号个数多。如果字符串检验完成了,堆栈不空,说明左括号个数多
有人在提交的时候,使用了STL,导致了运行期错误。
下面分别给出几个版本的代码
STL版:
#include <stdio.h> #include <string.h> #include <stack> using namespace std; int judge(char*s) { stack<char> st; int len=strlen(s); for(int i=0; i<len; ++i) { if(s[i]=='('||s[i]=='[') { st.push(s[i]); } else{ if(st.empty()) return 0; char t=st.top(); if(s[i]==')' && t=='(') { st.pop(); } else if(s[i]==']' && t=='[') st.pop(); else return 0; } } if(!st.empty()) return 0; return 1; } int main() { char s[10000]; int T; scanf("%d",&T); while(T--){ scanf("%s",s); if( judge(s) ) printf("Yes\n"); else printf("No\n"); } }
数组模拟堆栈版:
#include<stdio.h> #include<string.h> char x[10002],y[10002]; int main() { int i,N,len,j,flag; scanf("%d",&N); while(N--) { scanf("%s",x); len=strlen(x); for(i=0,j=0,flag=1;i<len;i++) { if(x[i]=='['||x[i]=='(') y[j++]=x[i]; else if(j>0&&((x[i]==']'&&y[j-1]=='[')||(x[i]==')'&&y[j-1]=='('))) j--; else { flag=0; break; } } if(flag==1&&j==0) printf("Yes\n"); else printf("No\n"); } return 0; }
最优版:
#include <stdio.h> int main() { char s[10001],x[10001]; int t,a,c; scanf("%d",&a); while(a--) { scanf("%s",s); t=c=0; while(c<10000&&(x[t++]=s[c++])!='\0') if(t>1&&(x[t-1]=f=']'&&x[t-2]=='['||x[t-1]==')'&&x[t-2]=='('))t-=2; if(t==1) printf("Yes\n"); else printf("No\n"); } return 0; }
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入