平衡的括号(栈)

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

 

你可能感兴趣的:(栈)