c语言/c++(数据结构篇) 之 括号匹配检验实例(栈和队列)(4/7) 实验目的及要求: 熟悉掌握利用栈完成括号是否匹配的检验。 实验内容: 利用栈完成括号匹配检验。 目的:掌握栈的后进先出原则在解决实际问题中的应用。 内容:输入一组括号,构造栈,利用栈判断所输入的括号是否匹配,并能够输出匹配、多左括号、多右括号三种不同结果。 对输入的任意个非负十进制数,打印出与其值相等的八进制数。 具体实现过程: 1、以数组表达顺序栈,用来存放将要输入的括号; 2、通过栈底指针的不同取值区分不同情况; 3、对函数进行连接。 4、基本要求:检验有圆括号出现的情况;深入分析:检验同时出现圆括号、方括号和花括号的情况。 实验步骤与程序: #include<stdio.h> #include<stdlib.h> typedef struct { int *base; int *top; int size; }sqstack; sqstack initstack() { sqstack s; s.base=(int *)malloc(100*sizeof(int)); s.top=s.base; return s; } sqstack push(sqstack s,int e) { *(s.top)=e; s.top++; return s; } int gettop(sqstack s) { if(s.base==s.top) { return 0; } return *(s.top-1); } sqstack pop(sqstack s) { s.top–; return s; } void print(sqstack s) { while(gettop(s)!=0) { printf(“%d ”,gettop(s)); s=pop(s); } } int main() { sqstack s; char c=’ ‘; s=initstack(); printf(“请输入括号,以#结束 ”); while(c!=’#’) { scanf(“%c”,&c); switch (c) { case ‘(‘:s=push(s,1);break; case ‘[‘:s=push(s,2);break; case ‘{‘:s=push(s,3);break; case ‘)’: { if(gettop(s)==0) { printf(“多了*)* ”); return 0; } else if(gettop(s)==1) { s=pop(s); } else { printf(“括号不匹配! ”); return 0; } };break; case ‘]’: { if(gettop(s)==0) { printf(“多了*]* ”); return 0; } else if(gettop(s)==2) { s=pop(s); } else { printf(“括号不匹配! ”); return 0; } };break; case ‘}’: { if(gettop(s)==0) { printf(“多了*}* ”); return 0; } else if(gettop(s)==3) { s=pop(s); } else { printf(“括号不匹配! ”); return 0; } };break; default:break; } } if(s.top==s.base) { printf(“括号匹配 ”); } else { printf(“多了左括号 ”); } return 0; } 运行结果:
结果分析与讨论: 1. 我们可以利利用栈的特点即后进先出的特点来实现括号匹配的检验,存储括号字符的数组通过malloc实现动态分配长度,每读入一个括号,若是左括号,则直接进栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶左括号同类型,则二者匹配,将栈顶的左括号弹出,否则属于不合法情况。另外。如果输入序列已经读完,而栈中仍有等待匹配的左括号,或者读入一个右括号,而栈中已无等待匹配的同类型左括号,均属于不匹配的情况。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/63148.html