栈的应用——括号配对 南昌航空大学实验报告 课程名称: 数据结构A 实验名称: 实验三 栈的应用 班 级: XXX 学生姓名: XXX 学号: XXXXX 指导教师评定: XXX 签 名: XXX 一、实验目的 本实验是关于栈的应用,栈在各种高级语言编译系统中应用十分广泛,利用栈的“先进后出”的特点,分析C语言源程序代码中的的括号是否配对正确。 通过本实验的学习,可以理解栈的基本操作的实现。 二、实验内容 本实验要求设计一个算法,检验C源程序代码中的括号是否正确配对。对本算法中的栈的存储实现,我们采用的是顺序存储结构。要求能够在某个C源程序上文件上对所设计的算法进行验证。 三、程序分析 (1)int initStack(sqstack s) 初始化一个栈 (2)int push(sqstack *s,char x) 入栈,栈满时返回FALSE (3)char pop(sqstack *s) 出栈,栈空时返回NULL (4)int Empty(sqstack *s) 判断栈是否为空,为空时返回TRUE (5)int match(FILE *f) 对文件指针f对指的文件进行比较括号配对检验,从文件中每读入一个字符ch=fgetc(f),采用多路分支switch(ch)进行比较: ①若读入的是“[”、“{”或“(”,则压入栈中, ②若读入的是“]”,则:若栈非空,则出栈,判断出栈符号是否等于“[”,不相等,则返回FALSE。 ③若读入的是“}”,则:若栈非空,则出栈,判断出栈符号是否等于“{”,不相等,则返回FALSE。 ④若读入的是“)”,则:若栈非空,则出栈,判断出栈符号是否等于“(”,不相等,则返回FALSE。 ⑤若是其它字符,则跳过。 文件处理到结束时,如果栈为空,则配对检验正确,返回TRUE。 (6)主程序main()中定义了一个文件指针,输入一个已经存在的C源程序文件。 四、程序源代码 过程见后续,不想看过程的直接拉到底即可。 简要过程: 首先,通过看ppt上的以及书上的代码,懂了,但没完全懂,在我看来十分的抽象,,类似于“空头支票”。 其次,通过在网上的一系列查找,发现了不少问题,然后通过自己编写。基本实现了设计要求,但同时爷发现了问题。就是对于ppt上以及书上的代码有了更深程度的理解,也是理解了,ppt上以及书上的代码使用了动态一维数组。 最后,对代码进行了修改,用动态一维数组(ppt上以及书上的代码)来代替的普通的静态一维数组,并且每接收一个字符就对其进行相应的操作(之前是先存储起来然后才进行操作)。 详细过程: 首先,对于栈的基本操作实现,ppt的22、23页。 出栈和入栈还好,尤其是初始化: 这块起初在我看来就是定义了栈顶指针、栈底指针,以及一个栈的空间。感觉并没有什么用,好像是一张“空头支票”,看似美好,实则无用。 然后通过看书,发现也是如此,打着怀疑的态度写了起来,发现其实是有很多问题的。 其次,就去网上查了下,浏览了许多代码,然后根据“网络上大家的理解”以及“之前对于线性表的学习”建立了自己的思路。然后顺着自己的思路写下去,实现过程中也遇到很多问题。其中尤其是[[]以及[]]这两个例子,本应该是错误的,单结果总是显示正确,其中的[]]显示仅仅是只进行了一进一出两步操作:
通过多次修改,于是对其添加了一个计数变量,每次进行操作对其进行记录 因为对于最后一个],栈为空,则不会再出栈,所以只有一个出栈。 最后通过这句if(j!=(i+1))sign++;对其进行一个判断,判断是否处理完所有的输入量。解决了这个问题。 源代码: 通过这部分编写,发现了一些问题,其次便看到了网上(https://zhidao.baidu.com/question/193809143.html)的这篇回答。 c语言 一维数组如何增加长度
然后就发现ppt上以及书上的代码并非“空头”,而是使用了动态一维数组,一切都解释的通了。 而其中的bottom应该是对应的p,也就是数组指针,也是栈底指针。 最后,使用动态一维数组(ppt上以及书上的代码)来代替的普通的静态一维数组。 可以看到与ppt上的方法(下方代码)基本一致。 然后再通过对于课本P47的理解,其中最为重要的几句代码: 1.初始化函数(void init_Stack(SqStack &S))中的初始分配语句: 2.以及入栈函数(void push(SqStack &S,ElemType e))中的重新分配语句(即扩建语句): 3.还有入栈出栈函数中的赋值读值语句: 入栈: 出栈: 另,上次主函数的输入是,先通过数组保存,再对其素进行入栈出栈操作。这次打算每接收符号,就直接对其操作。其中用到了while((ch=getchar())!=’ ’)这句。 并且为了观察的方便,让主函数进入了循环中,在主函数添加了while(1)。 最终得到源代码: 写到这里本应是结束了的,可是我忽略了一点要求中的: ⑤若是其它字符,则跳过。 不过也是一点小问题,更改主函数中的 为 即可。 源代码: 运行图:
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/86360.html