




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构课程设计报告书题目:表达式求值系别:计算机科学与信息系学号:学生姓名:指导教师:完成日期:目录1 .刖百2 .概要设计2.1 数据结构设计2.2 算法设计2.3 ADT描述2.4 功能模块分析3 .详细设计3.1 数据存储结构设计3.2 主要算法流程图(或算法代码)4 .软件测试5 .总结附录在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为
2、+、-*、/,用#表示结束。算法输出:表达式运算结果。算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。2.概要设计数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈
3、顶元素时,指针top减1。算法设计为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR用以寄存运算符,另一个称做OPND用以寄存操作数或运算结果。.首先置操作数栈为空栈,表达式起始符"#"为运算符栈的栈底元素;.依次读入表达式,若是操作符即进OPNDt若是运算符则和OPTFa的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTFa的栈顶元素和当前读入的字符均为”#“)。ADT描述ADTStack数据对象:D=ai|aiCElemSet,i=1,2,n,n皂0数据对象:R1=<ai,aiJ1>|a,ai=D,i=2,n约定为端为栈顶,ai端
4、为栈底。基本操作:InitStack(&S)操作结果:构造一个空栈SoGetTop(S)初始条件:栈S已存在。操作结果:用P返回S的栈顶元素。Push(&S,ch)初始条件:栈S已存在。操作结果:寸1入元素ch为新的栈顶元素。Pop(&S)初始条件:栈S已存在。操作结果:删除S的栈顶元素。In(ch)操作结果:判断字符是否是运算符,运算符即返回1。Precede(c1,c2)初始条件:c1,c2为运算符。操作结果:判断运算符优先权,返回优先权高的。Operate(a,op,b)初始条件:a,b为整数,op为运算符。操作结果:a与b进行运算,op为运算符,返回其值。num
5、(n)操作结果:返回操作数的长度。EvalExpr()初始条件:输入表达式合法。操作结果:返回表达式的最终结果。ADTStack功能模块分析.栈的基本功能。InitStack(Stack*s)和IEtStack2(Stack2*s)分别构造运算符栈与构造操作数栈,Push(Stack*s,charch)运算符栈插入ch为新的栈顶元素,Push2(Stack2*s,intch)操作数栈插入ch为新的栈顶元素,Pop(Stack*s)删除运算符栈s的栈顶元素,用p返回其值,Pop2(Stack2*s)删除操作数栈s的栈顶元素,用p返回其值,GetTop(Stacks)用p返回运算符栈s的栈顶元素,
6、GetTop2(Stack2s)用p返回操作数栈s的栈顶元素。.其它功能分析。(1)In(charch)判断字符是否是运算符功能,运算符即返回1,该功能只需简单的一条语句即可实现return(ch='+'|ch='-'|ch='*'11ch='/'|ch='('|ch=')'11ch='#')。Precede(charc1,charc2)判断运算符优先权功能,该函数判断运算符c1,c2的优先权,具体优先关系参照表1。Operate(inta,charop,intb)操作数用对应的运算
7、符进行运算功能。运算结果直接返回。num(intn)求操作数的长度功能,需要用itoa函数把int型转换成字符串型,strlen函数可求字符长度。EvalExpr()主要操作函数运算功能。分析详细见“3.详细设计,3.2”。.详细设计数据存储结构设计因为表达式是由操作符,运算符和界限符组成的。如果只用一个char类型栈,不能满足2位以上的整数,所以还需要定义一个int类型的栈用来寄存操作数。/*定义字符类型栈*/typedefstructintstacksize;char*base;char*top;Stack;/*定义整型栈*/typedefstructintstacksize;int*ba
8、se;int*top;Stack2;主要算法流程图(或算法代码)Precede(charc1,charc2)判断运算符优先权,返回优先权高的。算符间的优先关系如下:+-*/()#+><<<<>>->><<<>>*>>>><>>/>>>><>>(<<<<<=)>>>>>>#<<<<<=表1算法代码如下:charPrecede(charc
9、1,charc2)用一维数组存储49种情况staticchararray49='>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','&
10、gt;','<','>','>','>','>','>','>','<','>','>',<','<','<','<','<','=','!','>''>''>''
11、>''!''>''>'<','<','<','<','<','!','='switch(c1)/*i为下面array的横标*/case'+':i=0;break;case'-':i=1;break;case'*':i=2;break;case'/':i=3;break;case'(':i=4;break;cas
12、e')':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=5;break;case'#':j=6;break;)return(array7*i+j);/*返回运算符array7*i+j为对应的c1
13、,c2优先关系*/)intEvalExpr()主要操作函数。算法概要流程图:retumGetTop2(OPND)操作数栈头2个数迸行运算/case平进操作符栈c=*ptr+;case+J进操作符栈c=*ptr+;利用该算法对算术表达式3*(7-2)求值操作过程如下:步骤OPTFOPNOBt输入字符主要操作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#*(37-2)#Push(OPNR
14、,'-')6#*(-372)#Push(OPND,'2')7#*(-372母Operate('7','-','2')8#*(35)#Pop(OPTR)9#*35#Operate('3','*',5')10#15#Return(GetTop2(OPND)表2算法代码如下:intEvalExpr()主要操作函数c=*ptr+;while(c!='#'|GetTop(OPTR)!='#')if(!In(c)/不是运算符即进栈if(!In(*(ptr-
15、1)ptr=ptr-1;m=atoi(ptr);/取字符串前面的数字段n=num(m);Push2(&OPND,m);ptr=ptr+n;c=*ptr+;elseswitch(Precede(GetTop(OPTR),c)case'<':/栈顶元素优先权底Push(&OPTR,c);c=*ptr+;break;case'=':/脱括号并接收下一字符x=Pop(&OPTR);c=*ptr+;break;case'>':/退栈并将运算结果入栈theta=Pop(&OPTR);b=Pop2(&OPND
16、);a=Pop2(&OPND);Push2(&OPND,Operate(a,theta,b);break;4.软件测试.运行成功后界面。-C:Prog.ra>FilesBicrosoftVisualStudioMyProjectsshujujieguoshiji.输入正确的表达式后。道输入正确的表达式以w结尾;337-23K考达式结果知15Pvessanykeytocontinue.更改表达式,输入有2位数的整数调试。-IalxcJ,C:PrograB睛输入正确的表达式以,肥结尾式2+门23*2河展达式结果为38PreESAnpkeptocontinue5.总结这次课程设
17、计让我更加了解大一学到的c和这个学期学到的数据结构。课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧。这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。就像我在写EvalExpr()函数时,忘了指针的地址符值不用加*号,这一点小小的错误也耽误了我几十分钟,所以说细节很重要。程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。在具体操作中这学期所学的数据结构的理论知识得到巩固,
18、达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机的重要作用,特别算术表达式有了深刻的理解。这个程序是我们3个人完成的,同时我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。某个人的离群都可能导致导致整项工作的失败。实习中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。团结协作是我们成功的一项非常重要的保证。而这次课程设计也正好锻炼我们这一点,这也是非常宝贵的最后,感谢老师在这次课程设计的悉心指导,祝老师身体健康,工作
19、顺利。程序源代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#defineNULL0#defineOK1#defineERROR-1#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT20/*定义字符类型栈*/typedefstructintstacksize;char*base;char*top;Stack;/*定义整型栈*/typedefstructintstacksize;int*base;int*top;/*全局变量*/StackOPTR;/*定义
20、运算符栈*/Stack2OPND;/*定义操作数栈*/charexpr255=""/*存放表达式串*/char*ptr=expr;intInitStack(Stack*s)/构造运算符栈(s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char);if(!s->base)returnERROR;s->top=s->base;s->stacksize=STACK_INIT_SIZE;returnOK;intInitStack2(Stack2*s)/构造操作数栈(s->base=(int*)mallo
21、c(STACK_INIT_SIZE*sizeof(int);if(!s->base)returnERROR;s->stacksize=STACK_INIT_SIZE;s->top=s->base;returnOK;intln(charch)/判断字符是否是运算符,运算符即返回return(ch='+'|ch='-'|ch='*'|ch=7'|ch='('|ch=')'|ch='#');)intPush(Stack*s,charch)/运算符栈插入ch为新的栈顶元素(*
22、s->top=ch;s->top+;return0;)intPush2(Stack2*s,intch)/操作数栈插入ch为新的栈顶元素(*s->top=ch;s->top+;return0;)charPop(Stack*s)/删除运算符栈s的栈顶元素,用p返回其值(charp;s->top-;p=*s->top;returnp;)intPop2(Stack2*s)/删除操作数栈s的栈顶元素,用p返回其值(intp;s->top-;p=*s->top;returnp;)charGetTop(Stacks)/用p返回运算符栈s的栈顶元素(charp=
23、*(s.top-1);returnp;)intGetTop2(Stack2s)/用p返回操作数栈s的栈顶元素(intp=*(s.top-1);returnp;)/*判断运算符优先权,返回优先权高的*/charPrecede(charc1,charc2)inti=0,j=0;staticchararray49='>','>','<','<','<','>','>','>','>','<&
24、#39;,'<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<&
25、#39;,'<','<','<','=','!','>','>','>','>','!','>','>','<','<','<','<','<','!','=';switch(cl)/*i为下面array的横标*
26、/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=5;break;case'#':j=6;break;)return(array7*i+j);/*返回运算符*/)/*操作函数*/intOperate(inta,charop,intb)(switch(op)(case'+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车棚制作合同范本
- 4-Biphenylthio-carboxamide-生命科学试剂-MCE
- 销售模具合同范本
- 孝感合同范本咨询
- 2025年贵金属化合物相关基础化学品合作协议书
- 2025年多级飘尘采样计合作协议书
- 诉讼保全担保承诺协议书(2篇)
- 2025年BN-TIB2导电复合陶瓷制品合作协议书
- 秸秆科研报告范文
- 教学类实践调研报告范文
- 【道法】开学第一课 课件-2024-2025学年统编版道德与法治七年级下册
- 中华民族共同体概论专家讲座第一讲中华民族共同体基础理论
- 卫生部病历管理规定
- 2023年浙江省统招专升本考试英语真题及答案解析
- GB 9706.202-2021医用电气设备第2-2部分:高频手术设备及高频附件的基本安全和基本性能专用要求
- 2. SHT 3543-2017施工过程文件表格
- 分部分项工程项目清单
- 跌倒护理不良事件案列分析 - 肾内科
- 电缆防火分析及措施
- 南水北调中线渠首段白蚁防治综合治理试验研究
- 幼儿园小足球活动游戏化教学的研究
评论
0/150
提交评论