- 1、本文档共27页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构算术表达式求值课程设计
目 录
1.前 言 2
2.问题描述 3
3.总体设计 3
3.1 概要设计 3
3.1.1 数据结构的选择 3
3.1.2 相关功能函数 3
3.1.3 函数模块调用关系 4
3.2详细设计和编码 5
4.运行与测试 9
4.1 上机调试 9
4.2 算法时间和空间性能分析 10
4.3程序运行测试结果 11
5. 总结与心得 13
5.1设计中难点的总结以及其它解决方案 13
5.2 实验心得 14
6. 用户使用说明 16
7. 参考文献 16
8. 附 录1(源代码清单) 16
9. 附 录2(成绩评定表) 25
1.前言
课程设计是实践性教学中的一个重要环节,它以某一课程为基础,它可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。
在数据结构的学习和课程设计过程中,我发现它要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,都必须加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。对于我们专业来说,虽然说对技术要求不是特别高,但是在实际操作过程中,没有足够的专业知识对于编程来说是远远不可以达到要求的,所以对于这次的课程设计,我们必须要通过自己额外补充知识来完成它。
在这次的课程设计中我选择的题目是表达式的求值演示。它的基本要求是:以字符序列的形式从终端输入语法正确的,不含变量的表达式。利用算符优先关系,实现对算术四则混合运算表达式的求值,并演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。—语句的前面去了,而return语句有跳出的作用,当它一旦执行,其后的语句都会被忽略而得不到执行。因此将它们调换顺序,正确写法见源程序。
(再次调试程序,输入一个测试表达式(如1+2*5#),发现结果是10,而且通过将栈中的数据进行显示发现1并未出栈,而操作符栈的“+”未进行运算便出了栈。通过步步跟踪来走程序发现,原来错误出在优先级判断的条件语句里面,在取出栈顶元素与刚读入的运算符进行比较时,当刚读入的运算符优先级高于栈顶的运算符时,直接将刚读入的运算符入栈,而刚从栈顶取出的一个运算符却抛之不管,当然会出错,因此应将刚取出的先入栈,然后将刚读入的运算符入栈。
(经过以上的修改,用一些简单的表达式进行测试发现能得出正确结果,但当输入像-7+1#或-(1+2*3)#这样的开头带负号的表达式时,程序计算的结果与实际相差甚远。因此应将开始的“-”作为负号而不是减号,并进行特殊的处理。 当输入的计算数据超过9时(如12+56#),计算结果又出错,通过输出栈中的数据进行观察发现栈将12分成了1和2,将56分成了5和6进行分别存储。这显然是错误的。通过检查程序发现输入语句用的是c=getchar(),该输入语句每次只能得到一个字符,12是两个字符1和2,因此会出现上面的情况。于是将输入改为字符串输入并存入一个字符数组中,然后将字符串转换成相应的运算符和数据以参与计算。
通过上面的更改,运行程序发现已经能接受大于9的数据以参与运算了;但当输入一些特殊非运算用符和字母时,又出现了意想不到的错误结果,因此程序采用了相应的算法,在使用刚输入的表达式字符串前,进行严格的检测。
4.2算法时间和空间性能分析
时间上,对于含n个字符的表达式,无论是对其进行合法性检测还是对其进行入栈出栈操作n次,因此其时间复杂度为O(n)。
空间上,由于在本程序中,在为算符栈(OPTR)和操作数栈(OPND)涉及到两种情况时申请空间,一方面分别为OPTR栈和OPND栈申请了初始的存储单元,均为STACK_INITSIZE=100个;另一方面,考虑到两个栈在处理具体的算术表达式时,有可能会出现溢出的情况,即栈的初始的存储空间不够用,这时需要为其申请额外的存储空间,每溢出一次,就为其申请存储单元STACKINCREMENT=10个;所以,本程序的算法的空间复杂度一方面取决于算术表达式的长度,另一方面取决于本程序的所有代码所占用的存储空间大小。
4.3程序运行测试结果
计算表达式1024/(4*8)
输入用户选择“1”继续计算表达式 3*(
文档评论(0)