Live2D //博客园自带,可加可不加

WLACM 1079: 括弧匹配检验 栈入门

1079: 括弧匹配检验

                                                                   时间限制: 1 Sec  内存限制: 128 MB
                                                                   [提交][状态][讨论版][命题人: 外部导入] 

 

题目描述

 

       假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。

现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?

输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK”,不匹配就输出“Wrong”。

输入一个字符串:[([][])],输出:OK

输入

 

       输入仅一行字符(字符个数小于255)

输出

 

匹配就输出 “OK” ,不匹配就输出“Wrong”。

样例输入

[(])

样例输出

Wrong

来源

栈和队列 

 

 此题常规循环一看就很难做,但是括号匹配容易让人想到栈,考虑用栈来写。

 

 1 #include <iostream>
 2 #include<cstring>
 3 #include<stack>
 4 using namespace std;
 5 //<>,(),[],{}
 6 char fan(char a){
 7     if(a=='<')
 8         return '>';
 9     else if (a=='(')
10         return ')';
11     else if(a=='[')
12         return ']';
13     else if(a=='{')
14         return '}';
15     else if(a=='>')
16         return '<';
17     else if (a==')')
18         return '(';
19     else if(a==']')
20         return '[';
21     else if(a=='}')
22         return '{';
23      
24 }
25 int main(int argc, char *argv[])
26 {
27     char s[256];
28     int n,j,i;
29     scanf("%d",&n);
30     for(i=0;i<n;i++){
31         stack <char> a;
32         scanf("%s",s);
33         int l=strlen(s);
34         for(j=0;j<l;j++){
35             if(a.empty()){
36                 if(s[j]=='<'||s[j]=='('||s[j]=='['||s[j]=='{')
37                     a.push(s[j]);
38                 else{
39                     printf("NO\n");
40                     break;
41                 }
42             }
43             else{
44                 if(s[j]=='<'||s[j]=='('||s[j]=='['||s[j]=='{'){
45                     if(s[j]=='{'&&(a.top()=='{'))
46                         a.push(s[j]);
47                     else if(s[j]=='['&&(a.top()=='['||a.top()=='{'))
48                         a.push(s[j]);
49                     else if(s[j]=='('&&(a.top()=='('||a.top()=='['||a.top()=='{'))
50                         a.push(s[j]);
51                     else if(s[j]=='<'&&(a.top()=='<'||a.top()=='('||a.top()=='['||a.top()=='{'))
52                         a.push(s[j]);
53                 }
54                 else{
55                     if(a.top()!=fan(s[j])){
56                         printf("NO\n");
57                         break;
58                     }
59                     else
60                         a.pop();
61                     
62                 }
63             }
64                 
65             
66             
67             
68         }
69         if(j==l&&a.empty())
70             printf("YES\n");
71         else if(j==l)
72             printf("NO\n");
73     }    
74     return 0;
75 }

 

此题为栈入门题,对于常规的栈增加了括号数量与括号顺序。

 这题还没想到很快的方法。。。这么长的代码写的头都痛了。。。。

 

posted @ 2018-08-01 10:20  Lejeune  阅读(494)  评论(0)    收藏  举报