2022年算术表达式求值演示程序 .pdf





《2022年算术表达式求值演示程序 .pdf》由会员分享,可在线阅读,更多相关《2022年算术表达式求值演示程序 .pdf(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数 理 学 院课程设计报告书课程名称数据结构课程设计设计题目算术表达式求值演示专业班级学号姓名指导教师2014 年12 月名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 20 页 - - - - - - - - - 1 设计时间2014 年 12 月 232014年 12 月 29 日2 设计目的设计一个程序,演示算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。3 设计任务(1) 设置运算符栈和运算数栈辅助分析算符优先关系;(2)
2、在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应的运算;(3) 在识别出运算数的同时,要将其字符序列形式转换成整数形式;(4) 在程序的适当位置输出运算符栈、运算数栈、输入字符和主要操作的内容。4 设计内容4.1 需求分析4.1.1该程序能实现算术四则运算表达式的求值,显示运算过程。4.1.2输入的形式:表达式,例如5*(3+7)#。包含的运算符只能有 +、 -、*、 /、 ( ) ;4.1.3输出的形式:运算结果, 50。4.1.4程序所能达到的功能:对表达式求值并输出。4.2 总体设计4.2.1 . 栈的抽象数据类型定义:ADT Stack 数据对象: D=ai|ai
3、Char,i=1,2.,n,n0数据关系: R1=ai-1,ai|ai-1,aiD,i=2,3.n 约定 an端为栈顶, ai 端为栈底名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 20 页 - - - - - - - - - 4.2.2 基本操作: InitStack(&S) 操作结果:构造一个空栈S。 GetTop(S) 初始条件:栈 S已存在。操作结果:用 P返回 S的栈顶元素。 Push(&S,ch) 初始条件:栈 S已存在。操作结果:插入元素ch 为新的栈顶元
4、素。 Pop(&S) 初始条件:栈 S已存在。操作结果:删除 S的栈顶元素。In(ch) 操作结果:判断字符是否是运算符,运算符即返回1。 Precede(c1, c2) 初始条件: c1,c2 为运算符。操作结果:判断运算符优先权,返回优先权高的。Operate(a,op,b) 初始条件: a,b 为整数, op 为运算符。操作结果: a 与 b 进行运算, op为运算符,返回其值。num(n) 操作结果:返回操作数的长度。EvalExpr() 初始条件:输入表达式合法。操作结果:返回表达式的最终结果。ADT Stack 主程序的流程:名师资料总结 - - -精品资料欢迎下载 - - - -
5、 - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 20 页 - - - - - - - - - EvaluateExpression()函 数实 现了 对 表 达式 求值 的 功 能, main() 函数 直接 调 用EvaluateExpression()对输入的表达式求值输出。算法流程图4.2.3 函数的调用关系图main EvaluateExpression Push precede In Pop ReturnOpOrd Operat输出名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -
6、- - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 20 页 - - - - - - - - - 4.3 详细设计4.3.1. Precede(char c1,char c2)判断运算符优先权,返回优先权高的。算符间的优先关系如下:+ - * / ( ) # + - * / ( # , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , !, , , , , , , , !, =; / 用一维数组存储 49 种情况switch(c1) /* i 为下面 array的横标 */ case +
7、 : i=0;break; case - : i=1;break; case * : i=2;break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 20 页 - - - - - - - - - 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
8、- : 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,c2优先关系 */ 利用该算法对算术表达式4*(6-2) 求值操作过程如下:步骤OPTR栈OPND栈输入字符主要操作1 # 4*(6-2)# Push(OPND, 4)2 # 4 *(6-2)# Push(OPTR, *)3 #* 4 (6-2)# Push(OPNR,
9、()4 #*( 4 6-2)# Push(OPND, 6)5 #*( 4 6 -2)# Push(OPNR, - )6 #*(- 4 6 2)# Push(OPND, 2)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 20 页 - - - - - - - - - 7 #*(- 4 6 2 )# Operate( 6, -, 2)8 #*( 4 4 )# Pop(OPTR) 9 #* 4 4 # Operate( 4, *,4 )10 # 16 # Return(GetT
10、op2(OPND) 算法伪代码如下:int EvalExpr()/ 主要操作函数 c = *ptr+; while(c!=#|GetTop(OPTR)!=#) if(!In(c) / 不是运算符即进栈 if(!In(*(ptr-1) ptr=ptr-1; m=atoi(ptr);/取字符串前面的数字段n=num(m); Push2(&OPND,m); ptr=ptr+n; c=*ptr+; else switch(Precede(GetTop(OPTR),c) case :/退栈并将运算结果入栈theta=Pop(&OPTR); b=Pop2(&OPND); a=Pop2(&OPND); Pu
11、sh2(&OPND,Operate(a,theta,b); break; 4.3.2主函数和其他函数的伪码int main( ) printf( 请输入正确的表达式以 #结尾:); do gets(expr); while(!*expr); InitStack(&OPTR); /* 初始化运算符栈*/ Push(&OPTR,#); /* 将#压入运算符栈*/ InitStack2(&OPND); /* 初始化操作数栈*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 2
12、0 页 - - - - - - - - - printf( 表达式结果为 :%dn, EvalExpr(); return 0; 4.3.3 函数的调用关系图调用关系图4.4 测试与分析4.4.1测试main EvaluateExpression Push precedIn Pop ReturnOpOrd Operat输出名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 20 页 - - - - - - - - - 4.4.2 实验分析:表达式求值程序是一个多次调用函数的过
13、程,且调用的过程较为复杂,调试花费时间较多。在while 循环时指针移动容易出错,因此多次出现内存错误,对于涉及的循环的操作开始和结束条件设置很关键。本次实验熟悉了栈数据结构的表示与实现方法。算法时间和空间分析:算法的运行时间主要花在while 循环上,它从头到尾扫描后缀表达式中的每一个数据(每个操作数或运算符均为一个数据),若后缀表达式由n 个数据组成,则此算法的时间复杂度为O(n)。此算法在运行时所占用的临时空间主要取决于栈S 的大小,显然,它的最大深度不会超过表达式中操作数的个数,因为操作数的个数与运算符(假定把 #也看作为一个特殊运算符,即结束运算符)的个数相等,所以此算法的空间复杂度
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年算术表达式求值演示程序 2022 算术 表达式 求值 演示 程序

限制150内