题目链接: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;

 

posted on 2015-07-22 15:28  尘埃。  阅读(1002)  评论(0编辑  收藏  举报