假设表达式中运行包含两种括号:圆括号和方括号,其嵌套顺序随意,即
([]) 或 [([][])]等均为正确的格式。[(]) 或 ([()) 或 (())]均为不正确的格式。检验括号
匹配的方法可以用“期待的急迫程度”这个概念来描述
分析可能出现不匹配的情况:
(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 }