数据结构-栈的实现之括号匹配检测
2016-04-17 14:42
253 查看
假设表达式中只允许两种括号:()、{};
正确表达顺序为:()或{}或({})或{({}{})}的形势;如{(}或(})或({)}的表达形势均不对。
算法的设计思想:
出现左括弧则进栈;
出现右括弧则首先检测栈是否为空,
若栈空则表明此右括弧多余,表达式不匹配。
否则和栈顶数据比较,若匹配则栈顶出栈。
否则表明表达式不匹配;
最后若栈空且没有做鱼右括弧则匹配正确,否则表明不匹配。
实现代码如下(Stack.h头文件为之前写的数据结构-栈的顺序结构中写的数组那个方法,用到了里面栈的结构和连个基本栈操作)
主函数测试代码如下:
测试只要输入表达式格式正确,则匹配结果是正确的。
正确表达顺序为:()或{}或({})或{({}{})}的形势;如{(}或(})或({)}的表达形势均不对。
算法的设计思想:
出现左括弧则进栈;
出现右括弧则首先检测栈是否为空,
若栈空则表明此右括弧多余,表达式不匹配。
否则和栈顶数据比较,若匹配则栈顶出栈。
否则表明表达式不匹配;
最后若栈空且没有做鱼右括弧则匹配正确,否则表明不匹配。
实现代码如下(Stack.h头文件为之前写的数据结构-栈的顺序结构中写的数组那个方法,用到了里面栈的结构和连个基本栈操作)
void Matching(char e[]) { Stack S; InitStack(S); unsigned int i = 0, state = 1; char z; while((int)(i <= strlen(e)) && state && e[i] != '\0') //结束条件 超出数组长度或state为0或字符串结束 { switch(e[i]) { case '(': case '{': Push(S,e[i]); //遇到({则进栈 i++; break; case ')': GetTop(S,z); if(!StackEmpty(S) && z == '(') //遇到)则判断栈顶是不是(,是的话出栈,不是则不匹配 { Pop(S,z); i++; } else state = 0; break; case '}': GetTop(S,z); if(!StackEmpty(S) && z == '{')//遇到}则判断栈顶是不是{,是则出栈,不是则不匹配 { Pop(S,z); i++; } else state = 0; break; } } if(StackEmpty(S) && state) //空栈且state不为0则全部匹配 printf("括号全部匹配"); else printf("括号不匹配"); }
主函数测试代码如下:
void main() { char e[20]; printf("请输入括号:"); scanf("%s",e); Matching(e); }
测试只要输入表达式格式正确,则匹配结果是正确的。
相关文章推荐
- 数据结构学习-递归(2)
- 【数据结构】 两个栈实现一个队列【面试】
- 归并两个带头结点的递增单链表 结果为递减链表
- 数据结构学习-递归(1)
- 数据结构之递归
- 堆排序 | 数据结构与算法
- 数据结构复习总结
- 20145205 java语言实现数据结构实验一
- redis之数据结构探究
- 树状数组求逆序数
- MySQL索引背后的数据结构及算法原理
- 重学数据结构系列之——图论算法之Dijkstra算法
- 重学数据结构系列之——图论算法之Prim算法
- 数据结构_对称矩阵
- 数据结构之并查集
- 数据结构和算法13 之快速排序
- 数据结构笔记之线性表
- 【数据结构】广义表的默认成员函数、深度、大小、打印
- 栈操作,构造,插入,删除,转换
- 数组与链表的异同(数据结构)