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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计1.docx

1、数据结构课程设计1软 件 学 院课程设计报告书课程名称 数据结构 设计题目 算术表达式求值演示 专业班级 软件工程09-05 学 号 0920010504 姓 名 韩亮 指导教师 孙宁 2010 年 12 月 31 日目录1.设计时间 32.设计目的 33.设计任务 34.设计内容 34.1需求分析3.4.1.1程序所要实现的功能34.1.2输入形式和输入值的范围34.1.3输出形式34.1.4测试数据34.2总体设计34.2.1设定栈的抽象数据类型定义: 34.2.2程序流程图:44.2.3模块调用关系: 5 4.3 详细设计: 54.3.1数据类型的实现 54.3.2主程序和其他主要函数的

2、伪码:64.3.3各函数之间的调用关系:104.4测试与分析114.4.1测试 114.4.2问题解决与讨论分析 124.4.3时间和空间复杂度分析和改进设想 124.5 附录(原代码及必要注释) 125.总结与展望 18参考文献 19成绩评定 191.设计时间 2010.12.272010.12.312.设计目的通过设计掌握数据结构课程中学到的基本理论和算法并综合运用于解决实践问题中,它是理论与实践的结合。通过做这个算术表达式求值演示的实验,来使我们对栈有一个更深层次的了解。3.设计任务算术表达式求值演示。设计一个程序,用栈来求解表达式的值,要求以表达式的形式输入,以#号结束,运算符为+-*

3、/(),要有输出结果。所能达到的功能,做+-*/运算。4.设计内容4.1需求分析4.1.1程序所要实现的功能实现用栈的入栈出栈演示表达式求值过程。4.1.2输入形式和输入值的范围以表达式的形式输入,输入值在0-9之间。操作符的范围+ - * / ()4.1.3 输出形式输出的形式以#号结束。4.1.4测试数据:正确测试:能以正确的形式输出。错误测试: 不能输出正确的结果,只能输出个错误的表达式。4.2总体设计4.2.1设定栈的抽象数据类型定义:ADT Stack 数据对象:D ai | ai ElemSet, i=1,2,.,n, n0 数据关系:R1 | ai-1, aiD, i=2,.,n

4、 约定an 端为栈顶,a1 端为栈底。 基本操作:InitStack(&S)操作结果:构造一个空栈 S。GetTop(S, &e)初始条件:栈 S 已存在且非空。操作结果:用 e 返回 S 的栈顶元素。Push(&S, e)初始条件:栈 S 已存在。操作结果:插入元素 e 为新的栈顶元素。StackEmpty(S)初始条件:栈 S 已存在。操作结果:若栈 S 为空栈,则返回 TRUE,否则 FALE。Pop(&S,&e)初始条件:栈 S 已存在且非空。操作结果:删除 S 的栈顶元素,并用 e 返回其值。 ADT Stack4.2.2主程序流程:InitStack(Stack *s) 和Init

5、Stack2(Stack2 *s)分别构造运算符栈与构造操作数栈,Push(Stack *s,char ch) 运算符栈插入ch为新的栈顶元素, Push2(Stack2 *s,int ch) 操作数栈插入ch为新的栈顶元素,Pop(Stack *s) 删除运算符栈s的栈顶元素,用p返回其值,Pop2(Stack2 *s)删除操作数栈s的栈顶元素,用p返回其值,GetTop(Stack s)用p返回运算符栈s的栈顶元素,GetTop2(Stack2 s) 用p返回操作数栈s的栈顶元素。(1)In(char ch) 判断字符是否是运算符功能,运算符即返回1,该功能(2) Precede(char

6、 c1,char c2) 判断运算符优先权功能,该函数判断运算符c1,c2的优先权。(3) Operate(int a,char op,int b)操作数用对应的运算符进行运算功能。运算结果直接返回。(4) num(int n) 求操作数的长度功能,需要用itoa函数把int型转换成字符串型,strlen函数可求字符长度。(5) EvalExpr()主要操作函数运算功能。(1)、主程序模块void main()struct Sqstack opnd;/操作数栈struct Sqstack optr;/操作符栈elemtype result; result=evaluate(opnd,optr)

7、; printf(the result is %dn,result);(2)运算模块实现数据表达式的运算(3)栈模块实现栈抽象数据类型4.2.3模块调用关系: 主模块先调用expr函数,之后依次调InitStack(&OPTR);Push(&OPTR,#); InitStack2(&OPND);最后调用运算模块EvalExpr()。4.3 详细设计:4.3.1数据类型的实现因为表达式是由操作符,运算符和界限符组成的。如果只用一个char类型栈,不能满足2位以上的整数,所以还需要定义一个int类型的栈用来寄存操作数。/* 定义字符类型栈 */typedef struct int stacksiz

8、e; char *base; char *top; Stack;/* 定义整型栈 */ typedef struct int stacksize; int *base; int *top; Stack2;4.3.2主程序和其他主要函数的伪码:1、 Precede(char c1,char c2) 判断运算符优先权,返回优先权高的。算符间的优先关系如下:+-*/()#+-*/(#, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , !, , , , , , , , !, =; /用一维数组存储49种情况switch(c1)

9、 /* i为下面array的横标 */ case + : i=0;break; case - : i=1;break; case * : i=2;break; case / : i=3;break; case ( : i=4;break; case ) : i=5;break; case # : i=6;break; switch(c2) /* j为下面array的纵标 */ case + : j=0;break; case - : j=1;break; case * : j=2;break; case / : j=3;break; case ( : j=4;break; case ) : j

10、=5;break; case # : j=6;break; return (array7*i+j); /* 返回运算符array7*i+j为对应的c1,c2优先关系*/ 2. int EvalExpr()主要操作函数。算法概要流程图:利用该算法对算术表达式3*(7-2)求值操作过程如下:步骤OPTR栈OPND栈输入字符主要操作1#3*(7-2)#Push(OPND,3)2#3*(7-2)#Push(OPTR,*)3#*3(7-2)#Push(OPNR,()4#*(37-2)#Push(OPND,7)5#*(3 7-2)#Push(OPNR,-)6#*(-3 72)#Push(OPND,2)7#

11、*(-3 7 2)#Operate(7,-,2)8#*(3 5)#Pop(OPTR)9#*3 5#Operate(3,*,5)10#15#Return(GetTop2(OPND)表2int EvalExpr(void) char c,theta,x,m,ch; int a,b; c = *ptr+; while(c!=#|GetTop(OPTR)!=#) if(!In(c) m=atoi(&c); Push(&OPND,m);c=*ptr+; else switch(Precede(GetTop(OPTR),c) case : theta=Pop(&OPTR); b=Pop(&OPND); a

12、=Pop(&OPND); Push(&OPND,Operate(a,theta,b); break; return GetTop(OPND); 主函数:int main(void) char *pc;printf(请输入要求的表达式并以# 结尾:); gets(expr);pc=expr;if(expr0=0)printf(请输入一个有效的表达式以#号结束n);printf(请再次输入要求表达式并以“#”结尾:); gets(expr);elsewhile(*pc!=0)pc+;pc-;if(*pc!=#)printf(请输入要求的表达式并以# 结尾:n);printf(请再次输入要求表达式并

13、以“#”结尾:); gets(expr);4.3.3各函数之间的调用关系: 输入表达式调用expr;表达式的值调用EvalExpr()算术式运算EvalExpr()用到GetTop,Push,Precede以及Pop函数4.4测试与分析4.4.1测试正确测试:2*(7-4)#请输入一个表达式以#号结束:2*(7-4)#1 2 PUSH(OPTR, #)2 # * PUSH(OPND, 2)3 # 2 ( PUSH(OPTR, *)4 #* 2 7 PUSH(OPTR, ()5 #*( 2 - PUSH(OPND, 7)6 #*( 2 7 4 PUSH(OPTR, -)7 #*(- 2 7 )

14、PUSH(OPND, 4)8 #*(- 2 7 4 # POP(OPTR)9 #*( 2 7 4 # POP(OPND)10 #*( 2 7 # POP(OPND)11 #*( 2 # OPERATE(7, -, 4)12 #*( 2 # PUSH(OPND, 3)13 #*( 2 3 # POP(OPTR)14 #* 2 3 输出结果为:6错误测试:12*6#请输入一个表达式以#号结束:12*6#1 1 PUSH(OPTR, #)2 # 2 PUSH(OPND, 1)3 # 1 * PUSH(OPND, 2)4 # 1 2 6 PUSH(OPTR, *)5 #* 1 2 # PUSH(OPN

15、D, 6)6 #* 1 2 6 输出结果为:124.4.2问题解决与讨论分析1、本设计的关键是运算符优先级的判断,由于优先级的错判,很容导致果的运算错误。 要明晰判断当前运算符和运算符栈栈顶元素的先后顺序,这个易出错误。2、在本次设计中充分利用了,栈先进后出的特点。3、二位数输入计算。我们应将二位数转换成一位数,将两个数字做特殊处理,放入同一个栈的同一位置,出栈时同时出栈,并加以计算。4.4.3时间和空间复杂度分析和改进设想空间复杂度和时间复杂度由于算术式计算量较小,因此不会占用过多时间复杂度,空间复杂度则决定于操作数与操作符的多少。改进设想:运用将一个式子分为多个部分,逐次计算。4.5 附录

16、(原代码及必要注释)#include#include#include#include#define DEBUG #define NULL 0 #define ERROR -1 #define STACKSIZE 20 /* 定义字符类型栈 */ typedef struct char stackname20; char *base; char *top; Stack; /* - 全局变量- */ Stack OPTR, OPND; /* 定义前个运算符栈,后个操作数栈 */ char expr255 = ; /* 存放表达式串 */ char *ptr = expr; int step = 0

17、; /* 计算的步次 */ int InitStack(Stack *s, char *name) s-base=(char *)malloc(STACKSIZE*sizeof(char); if(!s-base) exit (ERROR); strcpy(s-stackname, name); s-top=s-base; return 1; int In(char ch) return(ch=+|ch=-|ch=*|ch=/|ch=(|ch=)|ch=#); void OutputStatus(void) char *s; /* step */ printf(n%-8d, +step); /

18、* OPTR */ for(s = OPTR.base; s OPTR.top; s+) printf(%c, *s); printf(t); /* OPND */ for(s = OPND.base; s stackname; OutputStatus(); if(strcmp(name, OPND) = 0) printf(tPUSH(%s, %d), name, ch); else printf(tPUSH(%s, %c), name, ch); #endif *s-top=ch; s-top+; return 0; char Pop(Stack *s) char p; #ifdef D

19、EBUG OutputStatus(); printf(tPOP(%s), s-stackname); #endif s-top-; p=*s-top; return (p); char GetTop(Stack s) char p=*(s.top-1); return (p); /* 判断运算符优先权,返回优行权高的 */ char Precede(char c1,char c2) int i=0,j=0; static char array49= , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , !, , , ,

20、 , , , , !, =; switch(c1) /* i为下面array的横标 */ case + : i=0;break; case - : i=1;break; case * : i=2;break; case / : i=3;break; case ( : i=4;break; case ) : i=5;break; case # : i=6;break; switch(c2) /* j为下面array的纵标 */ case + : j=0;break; case - : j=1;break; case * : j=2;break; case / : j=3;break; case

21、( : j=4;break; case ) : j=5;break; case # : j=6;break; return (array7*i+j); /* 返回运算符 */ /*操作函数 */ int Operate(int a,char op,int b) #ifdef DEBUG OutputStatus(); printf(tOPERATE(%d, %c, %d), a, op, b); #endif switch(op) case + : return (a+b); case - : return (a-b); case * : return (a*b); case / : retu

22、rn (a/b); return 0; int EvalExpr(void) char c,theta,x,m,ch; int a,b; c = *ptr+; while(c!=#|GetTop(OPTR)!=#) if(!In(c) m=atoi(&c); Push(&OPND,m); c=*ptr+; else switch(Precede(GetTop(OPTR),c) case : theta=Pop(&OPTR); b=Pop(&OPND); a=Pop(&OPND); Push(&OPND,Operate(a,theta,b); break; return GetTop(OPND)

23、; int main(void) char *pc;printf(Input the expression(end with # sign):); gets(expr);pc=expr;if(expr0=0)printf(Please input a valid expression!n);printf(Input the expression again(end with # sign):); gets(expr);elsewhile(*pc!=0)pc+;pc-;if(*pc!=#)printf(Please asure the expression end with # sign!n);printf(Input the expression again(end with # sign):); gets(expr);5.总结与展望这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。就像我在写EvalExpr()函数时,忘了指针的地址符值不用加*号,这一点小小

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

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