没有合适的资源?快使用搜索试试~ 我知道了~
基于c语言的表达式求解课程设计论文.doc
0 下载量 104 浏览量
2023-07-10
13:03:41
上传
评论
收藏 315KB DOC 举报
温馨提示
试读
33页
基于c语言的表达式求解课程设计论文.doc
资源推荐
资源详情
资源评论
摘 要
通过数据结构这门课程,我们较深入的了解到了栈,栈是一种重要的线性结
构,它广泛应用于各种软件系统中,因此在面向对象的程序设计中,它们是多型
数据类型。
本次试验我们将探索表达式求值问题,表达式求值是程序设计语言编译中的
一个最基本的问题,它的实现是栈应用的又一个典型的例子。通过实在计算机中,
算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优
先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因
而在程序设计时,借助栈实现。用一个一维数组存放从键盘输入的表达式,表达式
中可包含:加(+)、减(-)、乘(*)、除(/),括号((,))等运算符。要对输入
的表达式进行检查,看是否是合格的表达式,如遇到错误则终止,不进行计算;
例如:括号不配对、除数不为零等;输入的表达式可以是常量表达式,也可以是
变量表达式;如果是常量表达式,则直接输出结果;如果是变量表达式,通过对
变量的不断赋值,计算变量取不同值时表达式的结果。参与运算的操作数可以是
整型,也可以是浮点型。
关键词: 栈;先进先出;带括号的表达式;表达式求值
目 录
1 绪论................................................................1
1.1 设计任务 ......................................................1
1.2 设计思想 ......................................................1
1.3 基础知识 ......................................................2
2 采用类 c 语言定义相关的数据类型 ......................................4
2.1 设定栈的数据类型定义 ..........................................4
2.2 设定表达式求值的抽象数据类型定义: ............................5
3 各模块的伪码算法 ....................................................7
3.1 存放操作符的模块: ............................................7
3.2 存放操作数的模块: ............................................7
3.3 栈的基本操作设置模块: ........................................7
4 函数的调用图 ........................................................9
4.1 系统总结构图 ..................................................9
4.2 算法模块的调用关系 ............................................9
4.3 表达式求值流程图 .............................................11
5 调试及测试 .........................................................12
5.1 调试分析 .....................................................12
5.1.1 调试中遇到的问题及对问题的解决方法 ......................12
5.1.2 算法的时间复杂度和空间复杂度 ............................13
5.2 测试结果 .....................................................14
6 源程序 .............................................................21
7 设 计 总 结 .....................................................29
致 谢 ..............................................................30
参考文献 ............................................................31
0
1 绪论
1.1 设计任务
(1)较熟练地掌握C语言的基本内容及程序设计的基本方法与编程技巧。
(2)较熟练地掌握在系统上编辑、编译、连接和运行 C 程序的方法。
(3)通过设计一个完整程序,掌握数据结构的算法编写、类 C 语言算法转换
成 C 程序并上机调试的基本方法。
(4)要达到理论与实际应用相结合,使学生能够根据数据对象的特性,学会
数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养良
好的程序设计技能。
(5)在实践中认识为什么要学习数据结构,掌握数据结构、程序设计语言、
程序设计技术之间的关系,是前面所学知识的综合和回顾。
1.2 设计思想
表达式求值是程序设计语言编译中的一个基本问题。它的实现是栈应用的一
个典型例子。要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对
表达式求值,首先要能正确解释表达式。要用栈求解一个表达式,就要将这个表达
式翻译成正确求值的一个机器指令序列,即正确解释表达式,了解算术四则混合运
算的规则:先乘除,后加减;从左算到右;先括号内,后括号外,再根据这个运算
优先的规定来实现对表达式的编译或解释执行。①从左至右依次扫描中缀表达式
的每一个字符,如果是数字字符和“.” ,则直接将它们写入后缀表达式中。②
如果遇到的是开括号“(”,则将它压入一个操作符栈中,它表明一个新的计算层
次的开始,在遇到和它匹配的闭括号时,将栈中元素弹出并放入后缀表达式中,
直到栈顶元素为开括号“(”时,将栈顶元素“(”弹出,表明这一层括号内的操
作处理完毕。③如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:当
所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元素放入
后缀表达式,并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作
符的优先级;当所遇到的操作符的优先级大于栈顶元素的优先级时,则将它压入
栈中。重复上述步骤直到遇到中缀表达式的结束‘\0’,弹出栈中的所有元素并放
入后缀表达式中,算法结束。
通过建立函数,完成栈的表达式求值。主函数可以调用子函数,分别完成字
符的输入,字符的检验,类型转换,表达式的运算和输出信息。在主函数中可以
1
设置调用子函数,根据输入的字符的不同,做出不同的判断,输出相应的结果。
算法设计:
(1)算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字
符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/,用#表
示结束。
(2)算法输出:表达式运算结果。
(3)算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表
达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。 栈是
一种数据结构,它按照后进后出的原则存储数据,先进入的数据被压入栈底,
最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据
被第一个读出来)。
1.3 基础知识
任何一个表达式都是由操作符,运算符组成的。我们分别用顺序栈来寄存表
达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。
顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素。
(1)堆栈又称堆栈(stack)在计算机科学中,是一种特殊的链表形式的数
据结构,它的特殊之处在于只能允许在链表的一端(称为栈顶,英文为 top)进行
添加和删除操作。另外堆栈数据结构的实现也可以通过数组来完成。
(2)严格来说堆是指 Heap,程序运行时供程序员来支配的一段内存。 而栈
Stack,多指函数调用时候参数的相互传递存在的内存区域。
由于堆栈数据结构只允许在一端进行操作,因而按照先进后出
(LIFO-Last In First Out)的原理工作。 堆栈数据结构支持两种基本操作,
压栈(push)和弹栈(pop):
(3)压栈(入栈):将对象或者数据压入栈中,更新栈顶指针,使其指向最
后入栈的对象或数据。
(4)弹栈(出栈):返回栈顶指向的对象或数据,并从栈中删除该对象或数
据,更新栈顶。
栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进
来的压在底下,随后一件一件往堆。取走时,只能从上面一件一件取。堆和
取都在顶部进行,底部一般是不动的。栈就是一种类似桶堆积物品的数据结
2
构,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈
(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO 表)。表达式
求值是程序设计语言编译中的一个最基本问题,它的实现是栈应用的又一个典型
例子。
为了实现算符优先算法,可以使用两个工作栈。一个称为 OPTR,用以寄存运
算符,另一个称作 OPND,用以寄存操作数或运算结果。算法的基本思想是:
(1)首先置非运算符栈为空栈,表达式起始符“#” 为运算符栈的栈底元素;
(2)依次读入表达式中每个字符,若是非运算符则进 OPND 栈,若是运算符则和
OPTR 栈的栈顶运算符比较优先权后做相应的操作,直至整个表达式求值完毕(即
OPTR 栈的栈顶元素和当前读入的字符均为“#”)。
表 1 算符间的优先关系
+
-
*
/
(
)
#
+
>
>
<
<
<
>
>
_
>
<
<
<
<
>
>
*
>
<
>
>
<
>
>
/
>
<
>
>
<
>
>
(
<
>
<
<
<
=
)
>
<
>
>
>
>
#
<
>
<
<
<
=
剩余32页未读,继续阅读
资源评论
yyyyyyhhh222
- 粉丝: 412
- 资源: 6万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功