栈的简单应用-括号匹配

  假设表达式中运行包含两种括号:圆括号和方括号,其嵌套顺序随意,即

([]) 或 [([][])]等均为正确的格式。[(]) 或 ([()) 或 (())]均为不正确的格式。检验括号

匹配的方法可以用“期待的急迫程度”这个概念来描述

  分析可能出现不匹配的情况:

  (1)到来的右括弧不是所“期待”的;

  (2)到来的是“不速之客”(右括弧多了); 

  (3)直到结束也没有到来所“期待”的(左括弧多了)。

  括号匹配的检验逻辑如下:

  (1)凡是出现左括弧,则进栈。

  (2)凡是出现右括弧,首先检查栈是否为空;

    若栈空,则表明“右括弧”多了;

    否则和栈顶元素比较:

    若相匹配,则“左括弧出栈”;

    否则不匹配。

  (3)表达式检验结束时:

    若栈空,则匹配正确;

    否则表明“左括弧”多了。

  具体代码如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #include "sqstack.h" //引入顺序栈储存结构及其基本操作
 5 #define OK 1
 6 #define ERROR 0
 7 void check(){
 8     //对于输入的任意一个字符串判断其括号是否匹配
 9 
10     SqStack *s=(SqStack*)malloc(sizeof(SqStack));
11     
12     StackType str[100],*p=NULL,*e;
13     e = (StackType*)malloc(sizeof(StackType));
14     if (InitStack(s) == OK) {
15         printf("请输入表达式\n");
16         gets(str);
17         p = str;
18         while (*p)  //没到串尾
19             switch (*p)
20             {
21             case'(':
22             case'[':
23                 Push(s, *p++); break;//左括号入栈 且p++
24             case')':
25             case']':
26                 if (EmptyStack(s) != OK) 
27                 {//栈不为空
28                     Pop(s, e); //弹出栈顶元素
29                     if(*p==')'&&*e!='('||*p=='['&&*e!=']')
30                         //弹出的栈顶元素与*p不匹配
31                     {
32                         printf("左右括号不匹配\n");
33                         return; 
34                     }
35                     else
36                     {
37                         p++; 
38                         break;
39                     }
40 
41 
42                 }
43                 else //栈空
44                 {
45                     printf("缺乏左括号\n");
46                     return;
47                 }
48             default: p++;//其他字符不处理,指针后移
49         }
50         if (EmptyStack(s) == OK) //字符串结束时栈空
51             printf("括号匹配\n");
52         else
53             printf("缺乏右括号\n");
54         
55 
56 
57 
58     }
59 
60 
61 
62 
63 }
64 
65 int main() {
66     check();
67     return 0;
68 
69 }

猜你喜欢

转载自www.cnblogs.com/mwq1024/p/10241437.html
今日推荐