Description

 You are given a string consisting of parentheses () and []. A string of this type is said to be correct:

(a)if it is the empty string
(b)if A and B are correct, AB is correct,
(c)if A is correct, (A ) and [A ] is correct.

Write a program that takes a sequence of strings of this type and check their correctness. Your program can assume that the maximum string length is 128.

Input 

The file contains a positive integer n and a sequence of n strings of parentheses () and [], one string a line.

Output 

A sequence of Yes or No on the output file.

Sample Input

3

([])

(([()])))

([()[]()])()

Sample Output 

Yes
No
Yes

解题思路:

注意:

1、匹配的括号序列长度必然为偶数

2、第一个括号必须为左括号('(' 或 '[' )

3、括号不会交叉嵌套出现(如:([)] 就不符合),具有对称性。

4、一行若是“\n“字符串也输出"Yes"。

如果我们当前看到了一个左括号,则我们不能判断其与哪个括号匹配,因为与之匹配的括号必定在其后面,因此我们还需要向后搜索。但是当我们看到一个右括号的时候,我们必然可以判断其与前面哪个括号匹配(或者找不到匹配)。因此我们的第一个匹配是从后面第一个右括号开始的,当我们找到一对匹配的括号的时 候,我们就可以把这对括号消除,然后继续找下一个右括号,继续消除,直到算法结束。显然我们遇到的第一个右括号必定与其前一个括号匹配,否则不满足第三条 规则。当我们删除了第一个匹配的括号之后,剩下的括号形成了一个新的序列。于是可以应用上面的思路继续经行匹配。

特征:后面的括号先被删除,最前面的括号最后被删除。这个规则符合栈的后进先出的规则。

程序代码:

 #include <iostream>
  #include <cstdio>
  #include <stack>
  #include <cstring>
  using namespace std;
  char str[200];

  bool judge(char x,char y)
  {
      if (x=='['&&y==']')   return 1;
    if (x=='('&&y==')')   return 1;
    return 0;
  }

  bool left(char x)
  {
      if( x=='['||x=='(')   return 1;
      return 0;
  }
  int main()
  {
      int t;cin>>t;
      getchar();
      while(t--)
      {
          stack<char>s;
          gets(str);
           if(strcmp(str,"\n")==0)    {cout<<"Yes"<<endl;continue;}
         for(int i=0;i<strlen(str);i++)
          {
             if(s.empty())      //判断栈是否为空
                s.push(str[i]);
             else
                if (!judge(s.top(),str[i]))
             {
                 if(left(str[i]))
                    s.push(str[i]);
             }
             else s.pop();

          }
          if(s.empty()) cout<<"Yes"<<endl;
          else cout<<"No"<<endl;
      }
      return 0;
  }