【数据结构】顺序栈和链式栈解决字符串括号匹配问题 【前言】题目示例: 编写一程序判断从键盘输入的子符串括号是否匹配。假设需判断的括号只有“(”,“)”,“[”,“]”,“{”,“}”六种。
可爱捏 目录 顺序栈编写代码 1.顺序栈存储类型 2.初始化栈,入栈,出栈操作 3.主函数 4.核心函数–判断是否匹配 5.整体代码 链式栈编写代码 1.链式栈存储类型 2.初始化栈,入栈,出栈操作 3.主函数 4.核心函数代码段 5.整体代码 正文开始: 顺序栈编写代码 1.顺序栈存储类型 顺序栈采用的是顺序存储,利用的是一组地址连续的存储单存放自栈底到栈顶的数据素,并且附加一个指针top来指向当前栈顶素位置。 那么第一步就是建立顺序栈的存储类型。我们将这组连续的存储单命名为zifuchuan的字符数组,同时定义宏stack_size=30,以此来限制字符串的长度。 2.初始化栈,入栈,出栈操作 我们对顺序栈进行初始化,也就是将top置为了-1,方便之后的操作。加1即可得到0,成为字符串数组的第一个下标。 下一步则是建立入栈和出栈函数。 入栈函数如下,参数需要传入的是建立的栈的指针和需要入栈的素。 注意在入栈前一定要先判断是否栈满,顺序栈的判定如上,top的值如果等于了stack _size-1,那就说明顺序栈已经满了。因为我们给的top是从-1开始的。可以将其与数组的最大长度类比一下,长度为30个数字的数组最多只有arr[29] 当栈判定不是满的那就意味着可以入栈素了。要注意的是,顺序栈采用的是先将指针加1,再加入素, 所以我们代码写的是++(素)。代表着先自加再使用。 那么到这里入栈操作就完成了,接下来就是出栈操作。 出栈也是同样道理,需要先判定栈是不是空的,毕竟如果是空的,就没有素可以出来了。 判断条件也十分简单,top等于-1就说明没有素入栈了。判断完成后只需要将top–即可,将top指向了栈顶的下一个素,那么上面那个素也就出栈了。 那么顺序栈的构建就基本完成了。 3.主函数 下面先来写主函数 主函数非常简单,也就是输入一个数组,将其放入接下来要写的bracketmatch函数中,如果符号匹配,那么返回1,如果不匹配则返回0了。 4.核心函数–判断是否匹配 上面就是程序的核心代码了。 首先建立栈,用以存放(和{。记得还要对其进行初始化。 再将str的整个字符串数组放入for循环,搭配switch寻找其中的(和{。 这里需要注意的是for循环的终止条件,当字符串数组不满我们所填的30个后,剩下的会以0填充。 所以终止条件如上。当遇到了(和{就将其放进栈中。 如果遇到了)和},则要用到ch啦,专门建立用来接收从栈里弹出的字符。此时,ch就会等于栈顶的那个素。那么现在就可以将ch与现在的str[i](也就是)或者{)进行一个比较,查看是否匹配。 需要用到的match函数如下 如果匹配则返回1,进入if循环,将那个匹配的(或者{进行出栈。如果不匹配那么就直接进入了braketmatch的return 0,也就是返回了0,程序结束。如果第一对匹配成功,将会继续循环寻找下一对,直到遍历完数组到0这个数字。 5.整体代码 运行示例
问题解决啦。其实链式栈也差不多,只是入栈出栈有些许区别罢了。想要了解的小伙伴接着往下看吧。 链式栈编写代码 1.链式栈存储类型 建立指针(下一个节点素的地址)与存储栈的素值。 2.初始化栈,入栈,出栈操作 第一步仍然是对栈的初始化,这里和顺序栈就有很大差别了。本质上就是创建一个头节点。 需要注意的四点: 1.栈空条件:s->next==NULL 2.栈满条件:一般不考虑栈满情况 3.进栈操作: 新建一个结点,让指针p指向它,将结点p插入到头结点之后 4.出栈操作: 取出首结点存放的值并进行删除 进行入栈操作
进行出栈操作
3.主函数 4.核心函数代码段 和顺序栈不同的地方也就是弹出的素赋给ch那里有一点差别。 其他基本相同。运行结果也相同。 5.整体代码 以上便是使用两种栈来解决符号匹配的问题啦,如果帮到了大家,还请留下你的赞,毕竟创作不易,为大家呈现好的内容需要花费大把的精力和时间去整理。 再见啦,希望大家健健康康,事事顺心捏!
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/87324.html