括号配对问题

1. 括号匹配的四种可能性:

①左右括号配对次序不正确

②右括号多于左括号

③左括号多于右括号

④左右括号匹配正确


2. 算法思想:

1.顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;

2.当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;

3.若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配失败,直接退出;

4.若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号,匹配失败,直接退出;

5.字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号,匹配失败;

6.正常结束则括号匹配正确。

 

 

 

代码如下:

 

1.C语言版

 

 1  
 2 #include<iostream>
 3 #include<string>
 4 #include<string.h>
 5 #include<algorithm>
 6 #include<cstdio>
 7 using namespace std;
 8 
 9 struct sStack
10 {
11     char sign[10010];
12     int top;
13 };
14 
15 void initstack(sStack &s)
16 {
17     s.top = -1;
18 }
19 
20 bool isemptystack(sStack &s)
21 {
22     return s.top == -1 ? 1 : 0;
23 }
24 
25 int pushstack(sStack &s, char c)
26 {
27     s.sign[++s.top] = c;
28     return 1;
29 }
30 
31 int popstack(sStack &s)
32 {
33     if(isemptystack(s))
34         return 0;
35     s.top--;
36     return 1;
37 }
38 
39 char topstack(sStack &s)
40 {
41     if(isemptystack(s))
42         return 0;
43     return s.sign[s.top];
44 }
45 
46 int main()
47 {
48     int N, len, i;
49     bool flag;
50     char str[10010];
51     sStack s;
52     scanf("%d", &N);
53     while(N--)
54     {
55         flag = 1;
56         scanf("%s", str);
57         len = strlen(str);
58         initstack(s);
59         for(i = 0; i < len; ++i)
60         {
61             if(str[i] == '(' || str[i] == '[' || str[i] == '{')
62                 pushstack(s, str[i]);
63             else if(str[i] == ')')
64             {
65                 if(isemptystack(s) || topstack(s) != '(')    flag = 0;
66                 else    popstack(s);
67             }
68             else if(str[i] == ']')
69             {
70                 if(isemptystack(s) || topstack(s) != '[')    flag = 0;
71                 else    popstack(s);
72             }
73             else if(str[i] == '}')
74             {
75                 if(isemptystack(s) || topstack(s) != '{')    flag = 0;
76                 else    popstack(s);
77             }
78         }
79         if(!isemptystack(s)) {flag = 0;}
80         if(flag)    printf("Yes\n");
81         else    printf("No\n");
82     }
83     return 0;
84 }        
View Code

 

 

2.STL

 

 

 1 #include <iostream>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <stack>
 6 using namespace std;
 7 
 8 int main()
 9 {
10     int N, len, i, flag;
11     char str[10010];
12     scanf("%d", &N);
13     while(N--)
14     {
15         flag = 1;
16         scanf("%s", str);
17         len = strlen(str);
18         stack<char>s;
19         for(i = 0; i < len; ++i)
20         {
21             if(str[i] == '(' || str[i] == '[' || str[i] == '{')
22                 s.push(str[i]);
23             else if(str[i] == ')')
24             {
25                 if(s.empty() || s.top() != '(')    flag = 0;
26                 else    s.pop();
27             }
28             else if(str[i] == ']')
29             {
30                 if(s.empty() || s.top() != '[')    flag = 0;
31                 else    s.pop();
32             }
33             else if(str[i] == '}')
34             {
35                 if(s.empty() || s.top() != '{')    flag = 0;
36                 else    s.pop();
37             }
38         }
39         if(!s.empty()) {flag = 0;}
40         if(flag)    printf("Yes\n");
41         else    printf("No\n");
42     }
43     return 0;
44 }
View Code

 

 

 

 

posted @ 2014-04-03 03:26  猫御龙  阅读(457)  评论(0编辑  收藏  举报