NYOJ2—括号配对问题

括号配对问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述
现在,有一行括号序列,请你检查这行括号是否配对。
 
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
算法:
采用栈这种数据结构,遍历字符串遇到'('和'['的时候放入栈中,遇到')'和']'的时候取出栈顶元素进行对应的匹配,匹配上了就出栈,直到遍历完成,如果栈中还有剩余的元素没有出栈,那么输出NO否则输出Yes
下面我们来看一下具体的代码
 1 #include <iostream>
 2 #include<string.h>
 3 #include<stack>
 4 using namespace std;
 5 int main()
 6 {
 7     int n;
 8     cin>>n;
 9     while(n--)
10     {
11         char a[10010];
12         cin>>a;
13         int i,l;
14         l=strlen(a);
15         if(l%2==1)//字符个数为奇数则肯定不匹配
16         {
17             cout<<"No"<<endl;
18             continue;
19         }
20         stack <char> s;
21         for(i=0;i<l;i++)
22         {
23             if(a[i]=='('||a[i]=='[')
24             {
25                 s.push(a[i]);
26             }
27             else
28             {
29                 if(!s.empty()&&s.top()=='('&&a[i]==')')
30                 {
31                     s.pop();
32                     continue;
33                 }
34                 if(!s.empty()&&s.top()=='['&&a[i]==']')
35                 {
36                     s.pop();
37                     continue;
38                 }
39             }
40         }
41         if(!s.empty())
42         {
43            cout<<"No"<<endl;
44             continue;
45         }
46         else
47         {
48            cout<<"Yes"<<endl;
49             continue;
50         }
51     }
52     return 0;
53 }

若有不足和错误之处,欢迎兄弟们拍砖指正!!!

posted @ 2018-01-13 18:07  西*风  阅读(220)  评论(0编辑  收藏  举报