题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/A
题意:输入一个包含“()”和“[]”的括号序列,判断是否合法。具体规则如下:
1)空串合法。
2)如果A和B都合法,则AB合法。
3)如果A合法则(A)和[A]都合法。
案例:
input
3
([])
(([()])))
([()[]()])()
output
Yes
No
Yes
思路分析:
1)如果长度为0,即为空串,输出Yes。
2)如果输入第一个字符为')'或']',不可能会合法,直接输出No。
3)进行循环判断,如果为'('或'['把它存入另一个数组中,如果为')'或']'就删除前一个'('或'['(j--),但是([)]也是错误的,所以可知如果合法,则')'或']'前面一个必为'('或'[',所以在删除前要进行判断,还有()]也是错误的,所以在判断')'或']'前,要先判断j是否为0。若为0,跳出循环。
如果循环正常运行结束并且那另一个数组都删除完了(j==0),就输出Yes,否则输出No。
源代码如下:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int main() 6 { 7 char s[130],x[130]; 8 int n,j,i; 9 cin>>n; 10 getchar(); 11 while(n--) 12 { 13 j=0; 14 gets(s); 15 if(strlen(s)==0) //判断是否为空串 16 { 17 cout<<"Yes"<<endl; 18 continue; 19 } 20 if(s[0]==')'||s[0]==']') 21 { 22 cout<<"No"<<endl; 23 continue; 24 } 25 for(i=0;i<strlen(s);i++) 26 { 27 if(s[i]=='('||s[i]=='[') 28 x[j++]=s[i]; 29 else 30 { 31 32 if(j==0) 33 break; 34 if(s[i]==')') 35 { 36 if(x[j-1]=='(') 37 j--; //删除“(” 38 else 39 break; 40 } 41 if(s[i]==']') 42 { 43 if(x[j-1]=='[') 44 j--; //删除“[” 45 else 46 break; 47 } 48 } 49 } 50 if(j==0&&i==strlen(s)) 51 cout<<"Yes"<<endl; 52 else 53 cout<<"No"<<endl; 54 } 55 return 0;