ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:124.12KB ,
资源ID:25282605      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25282605.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《数据结构课程设计》表达式求值实验报告.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《数据结构课程设计》表达式求值实验报告.docx

1、数据结构课程设计表达式求值实验报告实验课程名称专学学指业 班 级生 姓 名号导 教 师20至 20 学年第学期第至周0算术表达式求值演示1、概述数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算 法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基 本技能和科学作风方面受到比较系统和严格的训练。在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同

2、时加深对这种结构 的理解和认识。二、 系统分析1 以字符列的形式从终端输入语法正确的、不含变量的整数表达式。利用已知的算符 优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例子在求值中 运算符栈、运算数栈、输入字符和主要操作的变化过程。2 一般来说,计算机解决一个具体问题时,需要经过几个步骤:首先要从具体问题抽 象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编出程序, 进行测试,调试直至得到想要的答案。对于算术表达式这个程序,主要利用栈,把 运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法,可以使用两个 栈,一个用以寄存运算符,另一个用以寄存操作数和运算结

3、果。3 演示程序是以用户于计算机的对话方式执行,这需要一个模块来完成使用者与计算 机语言的转化。4 程序执行时的命令:本程序为了使用具体,采用菜单式的方式来完成程序的演示,几乎不用输入什么特 殊的命令,只需按提示输入表达式即可。(要注意输入时格式,否者可能会引起一些错 误)5.测试数据。1三、 概要设计一个算术表达式中除了括号、界限符外,还包括运算数据和运算符。由于运算符有优先级别之 差,所以一个表达式的运算不可能总是从左至右的循序执行。每次操作的数据或运算符都是最近输 入的,这与栈的特性相吻合,故本课程设计借助栈来实现按运算符的优先级完成表达式的求值计算。算法设计程序包含三个模块(1) 主程

4、序模块,其中主函数为void main输入表达式;根据要求进行转换并求值;输出结果;(2) 表达式求值模块实现具体求值。(3) 表达式转换模块实现转换。各个函数之间的调用关系2栈的抽象数据类型定义ADT SqStack数据对象:D=ai| ai ElemSet,i=1,2,3,n,n0数据关系:R1=| ai-1,aiD,i=1,2,3,,n约定其中 ai端为栈底,an端为栈顶。操作集合:(1)void InitStack1(SqStack1 &S1);/声明栈建立函数(2)void InitStack2(SqStack2 &S2);/声明栈建立函数(3)void evaluate(SqSta

5、ck1 &S1,SqStack2 &S2);/确定如何入栈函数(4)void Push1(SqStack1 &S1,char e);/声明入栈函数(5)void Push2(SqStack2 &S2,float e);/声明入压栈函数(6)char GetTop1(SqStack1 &S1);/声明取栈顶元素函数(7)float GetTop2(SqStack2 &S2);/声明取栈顶元素函数(8)char Pop1(SqStack1 &S1);/声明出栈函数(9)float Pop2(SqStack2 &S2);/声明出栈函数(10)char Compare(char m,char n);/

6、声明比较函数(11)float Operate(float a,char rheta,float b);/声明运算函数(12)void DispStack1(SqStack1 &S1);/从栈底到栈顶依次输出各元素(13)void DispStack2(SqStack2 &S2);/从栈底到栈顶依次输出各元素ADT SqStack结构分析:栈中的数据节点是通过数组来存储的。因为在 C 语言中数组是用下标从零开始的,因此我们在调用他们的数据是要特别注意。指针变量的值要么为空(NULL),不指向任何结点;要么其值为非空,即它的值是一个结点的存储地址。注意,当 P 为空值时,则它不指向任何结点,此时

7、不能通过 P 来访问结点,否则会引起程序错误。如果输入的数字不符合题目要求,则会产生错误结果。 算法的时空分析:时间和空间性能分析:时间上,对于含 n 个字符的表达式,无论是对其进行合法性检测还是对其进行入栈出栈操作 n 次,因此其时间复杂度为 O(n)。空间上,由于是用数组来存储输入的表达式,用栈来存储运算中的数据和运算符,而栈的本质也用到的数组,数组在定义时必须确定其大小。在不知表达式长度的情况下确定数组的长度确非易事,此时极易造成空间的浪费,因此空间性能不是 很好。四、 详细设计3源程序#includeusing namespace std;#define STACK_INIT_SIZE

8、 100#define STACKINCREMENT 10typedef struct /运算符栈char *base;char *top;int stacksize;SqStack1;typedef struct /运算数栈float *base;float *top;int stacksize;SqStack2;void InitStack1(SqStack1 &S1);/声明栈建立函数void InitStack2(SqStack2 &S2);/声明栈建立函数void evaluate(SqStack1 &S1,SqStack2 &S2);/确定如何入栈函数 void Push1(SqS

9、tack1 &S1,char e);/声明入栈函数void Push2(SqStack2 &S2,float e);/声明入压栈函数char GetTop1(SqStack1 &S1);/声明取栈顶元素函数float GetTop2(SqStack2 &S2);/声明取栈顶元素函数char Pop1(SqStack1 &S1);/声明出栈函数float Pop2(SqStack2 &S2);/声明出栈函数char Compare(char m,char n);/声明比较函数float Operate(float a,char rheta,float b);/声明运算函数 void DispSt

10、ack1(SqStack1 &S1);/从栈底到栈顶依次输出各元素 void DispStack2(SqStack2 &S2);/从栈底到栈顶依次输出各元素/*主函数*/void main()4SqStack1 S1;/定义运算符栈SqStack2 S2;/定义运算数栈/freopen(data1.in,r,stdin);/freopen(data1.out,w,stdout);InitStack1(S1);/调用栈建立函数InitStack2(S2);/调用栈建立函数evaluate(S1,S2);/调用确定如何入栈函数cout按任意键结束!endl;/*运算符栈函数*/void InitS

11、tack1(SqStack1 &S1)/构造一个空栈 S1S1.base=(char *)malloc(STACK_INIT_SIZE *sizeof(char);if(!S1.base)cout=S1.stacksize)/如果栈满,追加存储空间S1.base=(char *)realloc(S1.base,(S1.stacksize+STACKINCREMENT)*sizeof(char); if(!S1.base) cout存储分配失败!;elseS1.top=S1.base+S1.stacksize;S1.stacksize=S1.stacksize+STACKINCREMENT;*S

12、1.top=e;S1.top=S1.top+1;/将元素压入栈中,指针上移char GetTop1(SqStack1 &S1)/取栈顶元素char e;if(S1.top=S1.base)coutnttt 运算符栈已空!n;else e=*(S1.top-1);return e;5void DispStack1(SqStack1 &S1)/从栈底到栈顶依次输出各元素char e,*p;if(S1.top=S1.base)cout ;elsep=S1.base;while(pS1.top)e=*p;p+;coute;char Pop1(SqStack1 &S1)/出栈char e;if(S1.t

13、op=S1.base)coutnttt 运算符栈已空!n;e=*(-S1.top);return e;/*运算数栈函数*/void InitStack2(SqStack2 &S2)/构造一个空栈 S2S2.base=(float *)malloc(STACK_INIT_SIZE *sizeof(float);if(!S2.base)cout=S2.stacksize)/栈满,追加存储空间S2.base=(float *)realloc(S2.base,(S2.stacksize+STACKINCREMENT)*sizeof(float); if(!S2.base)cout存储分配失败!;els

14、eS2.top=S2.base+S2.stacksize;S2.stacksize=S2.stacksize+STACKINCREMENT;*S2.top=e;S2.top=S2.top+1;/将元素 e 入栈,指针上移6void DispStack2(SqStack2 &S2)/从栈底到栈顶依次输出各元素 float e,*p;if(S2.top=S2.base)cout ;elsep=S2.base;while(pS2.top)e=*p;p+;coute;float GetTop2(SqStack2 &S2)/取栈顶元素float e;if(S2.top=S2.base) coutntt

15、运算数栈已空!; else e=*(S2.top-1);return e;float Pop2(SqStack2 &S2)/出栈float e;if(S2.top=S2.base)coutntt 运算数栈已空!; e=*(-S2.top);return e;/*确定如何入栈函数*/void evaluate(SqStack1 &S1,SqStack2 &S2)char c;float t,e;int n=0,i=1,j=0,k=0,l=0;char chSTACK_INIT_SIZE;int s=1;int flag=0,flag2=0;float p1,p2;char ch1;Push1(S

16、1,#);/将#入栈,作为低级运算符 coutch;c=ch0;7coutn对表达式求值的操作过程如下:n_n步骤t 运算符栈 S1t 运算数栈 S2t 输入字符tt 主要操作; while(c!=#|GetTop1(S1)!=#)coutn_n;couti+t;DispStack1(S1);couttt;DispStack2(S2);couttt;if(flag=1)k-;flag=0;if(flag2)k+=flag2;flag2=0;for(l=0;lk;l+)cout ;for(j=k;chj!=0;j+)cout=0)e=float(c-48);n+;if(n=1)t=e;else

17、if(n1)t=t*10+e;c=chs+;if(n=-1)e=float(c-48);t=t+e/10;8c=chs+;if(c=.)n=-1;c=chs+;if(c=0&c=9)|c=.)flag2+;goto as;if(c9)Push2(S2,t);coutttPush2(S2,t);else/输入的是运算符n=0;/非运算型数据计数器清零switch(Compare(GetTop1(S1),c)/比较运算符的优先级 case :/栈顶元素优先级低,则入栈且继续输入 Push1(S1,c);coutttPush1(S1,c);c=chs+;break;case =:/栈顶元素优先级相等

18、,脱括号并接收下一字符 Pop1(S1);cout:/栈顶元素优先级高,则退栈并将运算结果入栈 p1=Pop2(S2);p2=Pop2(S2);ch1=Pop1(S1);Push2(S2,Operate(p2,ch1,p1);coutttOperate(p2,ch1,p1);flag=1;break;9coutn_n;coutit#ttGetTop2(S2)tt;for(j=0;jk;j+) cout ;cout#ttRETURN(GETTOP(S2);coutn_n;if(S2.top-1=S2.base)/显示表达式最终结果coutn表达式的结果为:GetTop2(S2)endl;else

19、 coutn 表达式出错!n;char Compare(char m,char n)/运算符的优先级比较if(n=+|n=-)/输入符号为+、-if(m=(|m=#)return ;/栈顶元素为(、#,此时栈顶符号优先级低,返回;/否则,栈顶符号优先级高,返回else if(n=*|n=/)/输入的符号为*、/if(m=)|m=*|m=/)return ;/栈顶元素为)、*、/,此时栈顶符号优先 级高,返回else return ;/否则,栈顶符号优先级低,返回else if(n=()return;/输入的符号为(,则直接返回;/否则,栈顶符号优先级高,返回else /输入符号为其他if(m=

20、#)return=;/栈顶元素为#,此时优先级同,返回=else return ;/否则,栈顶符号优先级高,返回float Operate(float a,char theta,float b)/运算函数10float tmp=0;if (theta=+)tmp=a+b;/从运算符栈取出的符号为+,则运算数栈的两元素相加,并 返回else if(theta=-)tmp=a-b;/从运算符栈取出的符号为-,则运算数栈的两元素相减,并 返回else if(theta=*)tmp=a*b;/从运算符栈取出的符号为*,则运算数栈的两元素相乘,并 返回else if(theta=/) /从运算符栈取出的

21、符号为/,则运算数栈的两元素相除,并 返回if(b=0) coutn 表达式出错!除数不能为 0!n;else tmp=a/b;return tmp;五、运行与测试第六章 总结与心得数据结构的研究不仅涉及到计算机硬件的研究,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。在研究信息检索时也必 须考虑如何组织数据,以便使查找和存取数据元素更为方便。在课程设计中,应该力求算法简明易懂,而易于转换为上机程序;如果程序反复多次使用,则应该尽可能选用快速的算法;如果待解决的问题数据量极大,机器的存储空间较小,则在编写算法时应该考虑如何节省空间。以

22、后在编写程序时就应该注意到所编写程序的时间复杂度,以及是否运 用了良好的算法,而不能只是像以前编写程序时单纯使用 C 语言的知识,要充分考虑程序的性能, 争取编写出更优良的程序来。让我对数据结构有了更进一步的认识和了解,也让我知道,要想学好它要重在实践,理论与实际应用相结合,提高了自己组织数据及编写大型程序的能力,培养了基本的、良好的程序设计技能 力。通过实际操作,我也发现我的好多不足之处:(1)用栈的结构来解决表达式的求值,首先要解决的问题是如何将人们习惯书写的表达式转换成计11算机容易处理的表达式。开始有些茫然,后来通过结合课本和同学的帮助完成了该课题。(2)对一些看似简单的东西掌握不够熟练,比如由于函数的调用参数问题不熟而造成了调试的困难。 对于语法的掌握也欠缺成熟,需要进一步掌握。(3)栈的结构理解不够清晰,造成了设计程序时理不清头绪,需要对数据结构有更深层次的理解。13

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1