标签:
假设表达式中只允许两种括号:()、{};
正确表达顺序为:()或{}或({})或{({}{})}的形势;如{(}或(})或({)}的表达形势均不对。
算法的设计思想:
出现左括弧则进栈;
出现右括弧则首先检测栈是否为空,
若栈空则表明此右括弧多余,表达式不匹配。
否则和栈顶数据比较,若匹配则栈顶出栈。
否则表明表达式不匹配;
最后若栈空且没有做鱼右括弧则匹配正确,否则表明不匹配。
实现代码如下(Stack.h头文件为之前写的数据结构-栈的顺序结构中写的数组那个方法,用到了里面栈的结构和连个基本栈操作)
1 void Matching(char e[]) 2 { 3 Stack S; 4 InitStack(S); 5 unsigned int i = 0, state = 1; 6 char z; 7 while((int)(i <= strlen(e)) && state && e[i] != ‘\0‘) //结束条件 超出数组长度或state为0或字符串结束 8 { 9 switch(e[i]) 10 { 11 case ‘(‘: 12 case ‘{‘: 13 Push(S,e[i]); //遇到({则进栈 14 i++; 15 break; 16 case ‘)‘: 17 GetTop(S,z); 18 if(!StackEmpty(S) && z == ‘(‘) //遇到)则判断栈顶是不是(,是的话出栈,不是则不匹配 19 { 20 Pop(S,z); 21 i++; 22 } 23 else 24 state = 0; 25 break; 26 case ‘}‘: 27 GetTop(S,z); 28 if(!StackEmpty(S) && z == ‘{‘)//遇到}则判断栈顶是不是{,是则出栈,不是则不匹配 29 { 30 Pop(S,z); 31 i++; 32 } 33 else 34 state = 0; 35 break; 36 } 37 } 38 if(StackEmpty(S) && state) //空栈且state不为0则全部匹配 39 printf("括号全部匹配"); 40 else 41 printf("括号不匹配"); 42 }
主函数测试代码如下:
1 void main() 2 { 3 char e[20]; 4 printf("请输入括号:"); 5 scanf("%s",e); 6 Matching(e); 7 }
测试只要输入表达式格式正确,则匹配结果是正确的。
标签:
原文地址:http://www.cnblogs.com/ABook/p/5401038.html