算法——括号匹配问题(堆栈应用)
来源:互联网 发布:win10电脑mac地址修改 编辑:程序博客网 时间:2024/04/30 22:48
【例】假设有一个算术表达式包含圆括号、方括号和花括号,编写一个函数,用来判别表达式中的括号是否正确匹配,并设计一个测试主函数。
【分析】括号匹配共有一下四种情况:
①左、右括号匹配不正确;
②右括号多于左括号;
③左括号多余右括号;
④左右括号匹配正确。
另外,还应该想到,“何时进栈”,“何时出栈”,“何时取栈顶元素”,“何时栈空”
typedef struct{ DataType stack[MaxStackSize]; int top; //top表示顺序堆栈数组stack的当前栈顶位置}SeqStack;void StaticInitiate(*S){ S->top=0; //初始化栈顶下标值}int StackNotEmpty(S) //判断顺序堆栈S是否为空,非空返回1,否则返回0{ if(S.top<=0)return 0; else return 1;}int StackPush(SeqStack *S,DataType x)//把数据元素x存入顺序堆栈S中,入栈成功返回1,否则返回0{ if(S->top>=MaxStackSize) { printf("堆栈已满,无法插入!\n") return 0; } else { S->Stack[S->top]=x; S->top++; return 1; }}int StackPop(SeqStack *S,DataType) //取出顺序堆栈S的栈顶元素值由参数d带回,出栈成功则返回1,否则返回0{ if(S->top<=0) { printf("堆栈已空无数据元素出栈!\n"); return 0; } else { S->top--; //得注意top--,--top的差别 *d=S->stack[S->top]; return 1; }} int StackTop(SeqStack S,DataType *d) //取栈顶数据元素值由参数d带回,成功返回1,不成功返回0 { if(S.top<=0) { printf("堆栈已空!\n"); return 0; } else { *d=S.stack[S.top-1]; return 1; }}
测试主函数:
#include<string.h>#include<stdio.h>#define MaxStackSize 100typedef char DataType;#include"SeqStack.h" void ExpIsCorrect(char exp[],int n) { SeqStack myStack; int i; char c; StackInitiate(&myStack); for(i=0;i<n;i++) { if((exp[i]=='(')||(exp[i]=='[']||(exp[i]=='{')) { StackPush(&myStack,exp[i]); } else if(exp[i]==')'&&StackNotEmpty(myStack)&&StackTop(myStack,&c=='(') { StackPop(&myStack,&c); } else if(exp[i]==')'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c=='(') { printf("左右括号匹配不正确!\n"); return 0; } else if(exp[i]==']'&&StackNotEmpty(myStavk)&&StackTop(myStack,&c)&&c=='[') { StackPop(&myStack,&c); } else if(exp[i]==']'&&StackNotEmpty(mySatck)&&StackTop(myStack,c)&&c!='[') { printf("左右括号匹配次序不正确!\n"); return; } else if(exp[i]=='}'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c=='{') { StackPop(&myStack,&c); } else if(exp[i]=='}'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c!='{') { printf("左右括号匹配次序不正确!\n"); return; } else if(((exp[i]==')')||(exp[i]==']')||(exp[i]=='}'))&&!=StackNotEmpty(myStack)) { printf("右括号多于左括号!\n"); return; } } if(StackNotEmpty(myStack)) { printf("左括号多于右括号!\n"); } else { printf("左右括号匹配正确!\n"); } } void main() { char a[]="(())abc{[]()}"; char b[]="(()))abc{[]}"; char c[]="(()()abc{[]}"; char d[]="(())abc{[]}"; int n1=strlen(a); int n2=strlen(b); int n3=strlen(c); int n4=strlen(d); ExpIsCorrect(a,n1); ExpIsCorrect(b,n2); ExpIsCorrect(c,n3); ExpIsCorrect(d,n4); }
0 0
- 算法——括号匹配问题(堆栈应用)
- 堆栈应用括号匹配实验
- 堆栈数据结构应用之括号匹配检查(算法3.2.2)
- 数据结构之SeqStack---堆栈应用---括号匹配问题
- 九度题目1153:括号匹配问题(堆栈的应用)
- java堆栈(Deque双向队列)应用之括号匹配
- 括号匹配(不用堆栈)
- 用堆栈解决括号匹配问题(C语言)
- 算法复习--------------利用堆栈实现括号匹配
- java堆栈类解决括号匹配问题
- 考研数据结构与算法之堆栈的使用(三)利用堆栈匹配括号
- 用堆栈实现括号匹配——ADT实现
- 栈应用:括号匹配问题
- 堆栈--括号匹配检验
- 栈机制应用——括号匹配[()]
- 栈操作和应用—括号匹配
- 括号成对出现、判断括号是否匹配(不用堆栈)
- (容器配接器)堆栈应用:判断表达式中的括号是否匹配
- 微软2016校园招聘4月在线笔试题
- TCP状态转移图和四次握手
- 【Objective-C】GCD介绍
- hdu4975(二分图)
- 中国农业银行2015年10月利息计算程序
- 算法——括号匹配问题(堆栈应用)
- Java注解
- iOS性能优化—— Instruments
- java毕向东听课笔记11(异常体系)
- aaaa
- 深入理解 Objective-C 的方法调用流程
- 关于视图方面的UI控件
- JAVA Socket 底层是怎样基于TCP/IP 实现的
- 51nod1055(递推)