括号配对问题

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <stack>
 5 #include <algorithm>
 6 #include <cmath>
 7 using namespace std;
 8 
 9 stack<char> q;      //保存左的符号
10 int n;
11 char s[10010];      //字符串
12 
13 int main()
14 {
15     int i=0,ok;     //ok标记 是否出现 ‘]'||')'||'empty()' 不匹配的情况。
16     char ch;
17     scanf("%d",&n);
18     getchar();
19     while(n--)
20     {
21         ok=0;     i=0;
22         while(!q.empty())
23             q.pop();
24         scanf("%s",s);
25         int len =strlen(s);
26         while(i<len)
27         {
28             if('('==s[i]||'['==s[i])   {   q.push(s[i]);   i++;    }  
29             else  {  
30                 if(s[i]==']')           
31                 {
32                    if(!q.empty()&&q.top()=='[')         //如果栈为空后者栈定字符不等于'['时,表示不匹配
33                         { 
34                              q.pop();  i++;             
35                         }
36                    else
37                         {
38                              ok=1;   break;
39                         }
40                }
41                else
42                   if(')'==s[i])
43                     {
44                         if(!q.empty()&&q.top()=='(')    //如果栈为空后者栈定字符不等于'('时,表示不匹配
45                            {
46                               q.pop();i++;    
47                            }
48                         else
49                            {
50                               ok=1;   break;
51                            }
52                     }
53                 }
54       }
55       if(q.empty()&&!ok)        //如果栈空并且标记为0的话 表示匹配
56            printf("Yes
");
57       else
58           printf("No
");
59     }
60     return 0;
61 }
View Code

刚开始用switch写超时,最后改成这样、时间大大改善、

原文地址:https://www.cnblogs.com/WDKER/p/5394615.html