表达式求值实验报告
数据结构表达式求值实验报告

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告篇一:数据结构实验二——算术表达式求值实验报告《数据结构与数据库》实验报告实验题目算术表达式求值学院:化学与材料科学学院专业班级:09级材料科学与工程系pb0920603姓学邮名:李维谷号:pb09206285箱:指导教师:贾伯琪实验时间:20XX年10月10日一、需要分析问题描述:表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。
设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。
问题分析:在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。
因而在程序设计时,借助栈实现。
设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。
在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。
在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。
算法规定:输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。
为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。
输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。
程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。
测试数据:正确输入:12*(3.6/3+4^2-1)#输出结果:194.4无定义运算:12*(3.6/(2^2-4)+1)#输出结果:表达式出错,除数为0,无意义错误输入:12+s#输出结果:eRRoR!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。
数据结构实验报告表达式求值

数据结构实验报告题目:编制一个表达式求值的程序。
一.需求分析1.本演示程序中,利用堆栈存储结构存储读入的运算符,输入的限定范围是数字(0—9),以及+*/()。
输入字符串限定长度为20,可以根据需要进行改变。
如果遇到不是以上范围或者连续输入两个运算符,如:++,则会提示输入错误,请重新输入。
输出的结果是转换后的后序表达式,以及float型数字,不会含有非法字符。
2.演示程序采用的是文件输入,只需要在源代码中输入要输入的文件的地址,然后就可以在文本文件中进行输入,运行过程中会自动读取,输出文本输入的表达式,及运算结果。
3.程序执行的命令包括:1)构造字符优先级比较表,比较优先关系2)文件输入3)构造堆栈,运算符入栈4)堆栈输出,变为后序表达式,并计算5)输出结果,结束4.测试数据文件地址:C:\\Users\\lenovo\\Desktop\\4.txt1) 输入:(35+20/2)*2-4/2+12正确输出结果是:100.00002)输入:(35+20/2)*2-/2+12结果是:error input3) 输入:a+ar/3=135结果是:error input二.概要设计为实现以上程序功能,需运用堆栈用于存储运算符,因此需要定义抽象数据类型。
1.堆栈的抽象数据类型定义为:ADT stack{数据对象:D={ai|ai∈正整数,i=0,1,2,3,…n,及{+-*/()}}数据关系:R1={<ai-1,a1>|ai-1,ai∈D}基本操作:Init stack(&s)操作结果:构造一个空的堆栈sPush stack(&s, e)初始条件:存在堆栈s操作结果:元素e压入堆栈s,top+1Pop (&s,e)初始条件:栈s已经存在且非空操作结果:删除栈顶元素e,输出其值,top-12.程序包含三个模块:1)运算符优先关系模块2)主程序模块;Int main(void){初始化;Do{接受命令;处理命令;}while(“命令”=”退出”);}3)堆栈模块三.详细设计1.程序源代码解释为:float Result(int c,float r[],int top){ //定义输出结果int j;float temp;switch(c){ //以下是四种基本运算的计算定义,运算完成后直接将top-1值赋予topcase 42:r[top-1]=r[top-1]*r[top];top=top-1;break; //乘法case 43:r[top-1]=r[top-1]+r[top];top=top-1;break;///加法case 45:r[top-1]=r[top-1]-r[top];top=top-1;break;//减法case 47:r[top-1]=r[top-1]/r[top];top=top-1;break;// 除法case 94:for(j=1,temp=r[top-1];j<r[top];j++) //平方或者几次方的运算temp=r[top-1]*temp; //循环相乘r[top-1]=temp;top=top-1;break;}return(r[top]);}if(temp1!=1){while(top>=1){ //栈不空的时候,栈中元素赋给houzhi,并计数biaozhi[b++]=i;houzhi[i]=duizhan[top-1];top=top-1;i=i+1;}max=i; //从0到i循环输出后序表达式for(i=0,b=0;i<max;i++){if(i!=biaozhi[b])printf("%d ",houzhi[i]) ; //输出后序表达式中的数字else {printf("%c ",houzhi[i]); //输出后序表达式中的运算符b=b+1;}}top=-1;for(i=0,b=0;i<max;i++){ //从0到maxif(i!=biaozhi[b]){top=top+1;result[top]=houzhi[i]; //将后值赋予result,调用result函数,进行Result运算}else {Result(houzhi[i],result,top); //运算结束,输出栈顶值,既是运算结果top--;b=b+1;}}printf("\n\nThe result is %f ",Result(houzhi[i],result,top)); //输出并打印结果}}getch();return 0;///返回0}2.程序的模块调用:主程序↓文件打开读入字符↓输入字符有效及优先级的判断↓运算模块↓输出结果四.调试分析1.本次作业的核心就是利用堆栈将中序表达式改成后序表达式,然后进行表达式的求值。
《程序设计方法学》实验报告-算术表达式求值

X X X X X大学《程序设计方法学》实验报告实验一:算术表达式求值学院:X X X专业:计算机科学与技术姓名:X X X学号:XXXXX2010年11 月18 日目录1.前言 (1)2.概要设计 (1)2.1 数据结构设计 (1)2.2 算法设计 (1)2.3 ADT描述 (2)2.4 功能模块分析 (3)3.详细设计 (3)3.1 数据存储结构设计 (3)3.2主要算法流程图(或算法伪代码) (4)4.测试结果 (7)5.参考文献 (8)附录--程序源代码 (8)1.前言在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。
因而在程序设计时,借助栈实现。
算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。
为简化,规定操作数只能为正整数,操作符为+、-*、/,用#表示结束。
算法输出:表达式运算结果。
算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。
在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。
2.概要设计2.1 数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。
我们分别用顺序栈来寄存表达式的操作数和运算符。
栈是限定于紧仅在表尾进行插入或删除操作的线性表。
顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。
2.2 算法设计为了实现算符优先算法。
可以使用两个工作栈。
一个称为OPTR,用以寄存运算符,另一个称做OPND,用以寄存操作数或运算结果。
1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为”#”)。
数据结构实验报告 表达式求值

(一) 需求分析1、输入的形式和输入值的范围:根据题目要求与提示,先选择你要使用的表达式形式(中缀用1,后缀用0),在输入一个中缀表达式,输入数的范围为int型,此时,程序将计算出表达式的结果。
2、输出的形式:当按照程序要求选择了1或0之后,再输入表达式;如果选择的是1,则程序将自动运算出表达式结果;如果之前选择的是0,则程序将现将中缀表达式转化为后缀表达式并计算出结果。
3、程序所能达到的功能:本程序能计算出含+、-、*、/、(、)等运算符的简单运算。
4、测试数据:输入一个表达式,如果你之前选择的是“中缀表达式”,那么输入5*(4-2)#,那么输出结果是10;如果之前选择的是“后缀表达式”,那么输入5*(4-2)#,那么他将先转换成后缀表达式5 4 2 - * #,再输出结果10。
如果输入表达式没有结束标示符#,如5*(4-2),那将不会输出任何结果,或出现错误结果。
(二) 概要设计为了实现上述操作,应以栈为存储结构。
1.基本操作:(1). int GetTop(SqStack *s)初始条件:栈存在;操作结果:若栈为空,则返回s的栈顶元素;否则返回ERROR。
(2).void Push(SqStack *s,int e)初始条件:栈存在;操作结果:插入e为新的栈顶元素。
(3).int Pop(SqStack *s)初始条件:栈存在;操作结果:若栈不空,则删除之,并返回其值;否则返回REEOR。
(4).void InitStack(SqStack *s)初始条件:栈存在;操作结果:置栈为空。
(5).int Empty(SqStack *s)初始条件:栈存在;操作结果:判定s是否为空栈。
(6).int Operate(int a,char theta, int b)初始条件:操作数a和b存在,且theta是+、-、*、/四则运算;操作结果:返回a与b间theta运算的结果。
(7).int In(char s,char* TestOp)初始条件:s为待判断字符,TestOp为已知的算符集合;操作结果:s为算符集合中的元素则返回1,否则返回0.(8).int ReturnOpOrd(char op,char* TestOp)初始条件:op为待确定运算符,TestOp为已知的算符集合;操作结果:确定运算符类型。
(完整版)数据结构与算法表达式求值报告

• 两个操作数中间放一个操作符(人常用算数表示方法) • (3 + 4) × 5 - 6
后缀表达式
• 两个操作数后跟一个操作符(对计算机操作简单) •34+5×6-
前缀表达式的计算机求值
• 从右至左扫描表达式, • 遇到数字,将数字压入栈; • 遇到运算符,弹出栈顶的两个数, • 用运算符对它们做相应的计算(栈顶元素 operate with 次顶元
(5-1) 如果是右括号“)”,则直接压入栈S1; (5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入栈S2,直到遇到右括号为止, 之后将括号丢弃; (6) 重复步骤(2)-(5),直到表达式的最左边; (7) 将S1中剩余的运算符依次弹出并压入栈S2; (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。
的结果。
Eg.后缀表达式“3 4 + 5 × 6 -”
(1)从左至右扫描,将3和4压入栈; (2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与 前缀表达式做比较),计算出3+4的值,得7,再将7入栈; (3) 将5入栈; (4) 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈; (5) 将6入栈; (6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
Eg.中缀表达式“1+((2+3)×4)-5”转换为前缀表达式之后求值
扫描到的元素 5 -
) 4 ×
) 3 +
2 (
( + 1 到达最左端
S2(栈底->栈顶) 5 5
5 54 54
54 543 543
5432 5432+
算术表达式求值-数据结构实验报告

课程设计报告(20 -20 学年第学期)报告题目:算术表达式求值课程名称:数据结构任课教员:专业:学号:姓名:二0一年月日摘要:现代科学技术高速发展,各种高科技产品频频问世,而各种技术的基础都离不开基本的表达式求值,它虽然简单,但却是任何复杂系统的基本执行操作。
栈是一种重要的线性结构,从数据结构的角度看,它是一种特殊的线性表,具有先入先出的特点。
而算符优先法的设计恰巧符合先入先出的思想。
故我们基于栈这种数据结构,利用算符优先法,来实现简单算术表达式的求值。
关键字:算符优先法;算术表达式;数据结构;栈一、课题概述1、问题描述一个算术表达式是由运算数、运算符、界限符组成。
假设操作数是正整数,运算符只含有加“+”、减“-”、乘“*”、除“/”四种二元运算符,界限符有左括号“(”、右括号“)”和表达式起始、结束符“#”。
利用算符优先法对算术表达式求值。
2、设计目的(1)通过该算法的设计思想,熟悉栈的特点和应用方法;(2)通过对算符优先法对算术表达式求值的算法执行过程的演示,理解在执行相应栈的操作时的变化过程。
(3)通过程序设计,进一步熟悉栈的基本运算函数;(4)通过自己动手实现算法,加强从伪码算法到C语言程序的实现能力。
3、基本要求:(1)使用栈的顺序存储表示方式;(2)使用算符优先法;(3)用C语言实现;(4)从键盘输入一个符合要求的算术表达式,输出正确的结果。
4、编程实现平台Microsoft Visual C++ 6.0二、设计思路及采取方案1、设计思路:为了实现算符优先法,可以使用两个工作栈。
一个称做OPTR ,用以寄存运算符;另一个称做OPND ,用以寄存操作数或运算结果。
算法的基本思想是:(1)首先置操作数栈为空栈,表达式起始符“#”作为运算符栈的栈底元素; (2)依次读入表达式中每个字符,若是操作数则进入OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为“#”)。
数据结构表达式求值完整篇(含实验报告)

&s,SElemType_OPND&e); //出栈
/*
#i nclude "common .h"
#include "Sqstack.h"
#in clude "other.h"
//
void OPTR_I ni tStack(Sqstack_OPTR &s)
3前面的都听简单的,就是 小数编写这块想了很久,
定义了low做判定符号的标志。如果在运算符后输入负号则low=-1(将p入栈时入栈
的是p*low),继续输入ch
总结:
我觉得写的好的地方在于定义了flag,low分别作为小数入栈和负号与减号区别的条
件。第一次写这么长的代码,还有就是将输入的字符再转到小数这段代码可以留着很有 用。开始考虑的大整数想麻烦了,直接用double难度降低了很多
//取操作数的栈顶元素
voidOPTR_Push(Sqstack_OPTR
&s,SElemType_OPTR e);//入栈
voidOPND_Push(Sqstack_OPND
&s,SElemType_OPND e); //入栈
voidOPTR_Pop(Sqstack_OPTR
&s,SEIemType_OPTR&e); //出栈
//栈基本操作的函数声明
void OPTR_lnitStack(Sqstack_OPTR &s);
//运算符栈初始化
void OPBiblioteka D_InitStack(Sqstack_OPND &s);
//操作数栈初始化
数据结构实验报告-表达式求值与任务调度

数据结构与程序设计实验实验报告哈尔滨工程大学实验报告二printf("序号开始时间等待时间结束\n");que[0]=0;rear=1;T[0].start=0;i=0;t=0;j=1;while(i<n){t++;//时间移动i+=check(tdiff);//时间移动后检查是否有完成的任务,并且就算等待时间if(t>=T[j].t&&j<n){//假入在当前任务执行时间内有任务提交insert(j); //把任务插入到队列j++;qsort(que, rear, sizeof(que[0]), comp);//按时间长短排序}if(T[que[0]].start==-1)//给队列最前点赋起始值T[que[0]].start=t;}for(i=0;i<n;i++)//计算出所有等待时间sum+=T[i].wait;printf("平均等待时间为%.3lfs\n\n",sum/n);}四、界面设计1.表达式求值需要输入以’#’结尾的中缀表达式,以提示语句的方式给出。
输出注明是什么结果。
2.任务调度需要输入任务数,任务需要执行时间,(不同时需要任务提交时间),按平均等待时间最短为原则,输出出任务的执行顺序。
五、运行测试与分析1.表达式求值1).输入一个以’#’结尾的中缀表达式:2).输出计算结果,后缀表达式以及前缀表达式:3.任务调度:(1). 同时提交i).输入:ii).输出:(2). 不同时间提交i).输入:ii).输出:六、实验收获与思考1.熟练掌握栈的定义及使用。
2.了解表达式求值的转换算法。
设计前、后缀表达式求值算法。
3.设计操作数为多位实数,操作符为加、减、乘、除、求模的中缀表达式求值算法。
定义算数符号的优先级。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
福建农林大学计算机与信息学院计算机类课程设计报告课程名称:《面向对象程序设计》课程设计课程设计题目:表达式求值姓名:吴玲婷系:软件工程系专业:软件工程年级:2012学号:3126016054指导教师:林敏职称:讲师2014 年 1 月 1 日目录1、课程设计的目的 (1)2、课程设计的要求 (1)3、课程设计的内容 (1)3.1设计的任务 (1)3.2设计要求 (1)3.3程序的总体结构 (2)3.4详细设计 (3)3.4.1类的设计 (3)3.4.2各模块设计及程序流程 (4)3.4.3代码实现 (7)4、测试 (10)5、总结 (11)6、参考文献 (12)7、附录 (12)题目1、课程设计的目的(1)了解并掌握面向对象程序的设计方法,具备初步的独立分析和设计能力;(2)初步掌握应用面向对象程序进行软件开发的步骤;(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;(4)训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风;2、课程设计的要求(1)设计的课题能够体现面向对象程序设计的思路。
(2)根据自己对数据结构和算法的基本概念、原理和机制的理解,自拟题目和设计内容,选题尽可能结合实际的应用。
3、课程设计的内容3.1设计的任务在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。
因而在程序设计时,借助栈实现。
算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。
为简化,规定操作数只能为正整数,操作符为+、-、*、/,用#表示结束。
算法输出:表达式运算结果。
算法要点:设置运算符栈和运算数栈辅助分运析算符优先关系。
在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。
3.2设计要求用类实现对栈的封装功能,完成表达式求值。
任何一个表达式都是由操作符,运算符和界限符组成的。
我们分别用顺序栈来寄存表达式的操作数和运算符。
栈是限定于仅在表尾进行插入或删除操作的线性表。
顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1。
3.3程序的总体结构为了实现算符优先算法。
可以使用两个工作栈。
一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。
1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为”#”)。
3.用ADT 描述 ADT Stack{数据对象:D={i a |i a ∈ElemSet,i=1,2,…,n, n ≧0} 数据对象:R1={<1,-i i a a >|1-i a ,D a i ∈,i=2,…,n}约定n a 端为栈顶,i a 端为栈底。
基本操作:InitStack(&S)操作结果:构造一个空栈S 。
GetTop(S)初始条件:栈S 已存在。
操作结果:用P 返回S 的栈顶元素。
Push(&S ,ch)初始条件:栈S 已存在。
操作结果:插入元素ch 为新的栈顶元素。
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 Stack3.4详细设计3.4.1类的设计1).栈的基本功能。
InitStack(Stack *s) 和InitStack2(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的栈顶元素。
2).其它功能分析。
(1)In(char ch) 判断字符是否是运算符功能,运算符即返回1,该功能只需简单的一条语句即可实现,return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')。
(2) Precede(char c1,char c2) 判断运算符优先权功能,该函数判断运算符c1,c2的优先权,具体优先关系参照表1。
(3) Operate(int a,char op,int b)操作数用对应的运算符进行运算功能。
运算结果直接返回。
(4) num(int n) 求操作数的长度功能,需要用itoa函数把int型转换成字符串型,strlen 函数可求字符长度。
(5) EvalExpr()主要操作函数运算功能。
分析详见3.4.2。
3.4.2各模块设计及程序流程1).类的总体结构如下:Precede(ctemplate<class T>class Stack{int stacksize;T *base;T *top;public:int InitStack();void Push(T ch);T Pop();T GetTop();};2) 判断运算符优先权,返回优先权高的。
运算符间的优先关系如下:表 1算法伪代码如下:char Precede(char c1,char c2){static char array[49]={'>', '>', '<', '<', '<', '>', '>','>', '>', '<', '<', '<', '>', '>','>', '>', '>', '>', '<', '>', '>','>', '>', '>', '>', '<', '>', '>','<', '<', '<', '<', '<', '=', '!','>', '>', '>', '>', '!', '>', '>','<', '<', '<', '<', '<', '!', '='}; //用一维数组存储49种情况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 '(' : j=4;break;case ')' : j=5;break;case '#' : j=6;break;}return (array[7*i+j]); /* 返回运算符array[7*i+j]为对应的c1,c2优先关系*/ }3. int EvalExpr()主要操作函数。
算法概要流程图:利用该算法对算术表达式3*(7-2)求值操作过程如下:表2算法伪代码如下:int EvalExpr()//主要操作函数{char c,theta,x; int m;int a,b,i=0;while(*ptr!='#'||OPTR.GetTop()!='#'){c = *ptr;if(!In(c)) //不是运算符{sscanf(ptr,"%d",&m);OPND.Push(m);while(!In(*ptr))ptr++;}elseswitch(Precede(OPTR.GetTop(),c)){case '<': //栈顶元素优先级低OPTR.Push(c);*ptr++;break;case '=': //脱括号并接受下一字符x=OPTR.Pop();*ptr++;break;case '>': //退栈并将运算结果入栈theta=OPTR.Pop();b=OPND.Pop();a=OPND.Pop();OPND.Push(Operate(a,theta,b));break;}}3.4.3代码实现#include <cstdio>#include <stdlib.h>#include <iostream>#include <string.h>#define NULL 0#define OK 1#define ERROR -1#define STACK_INIT_SIZE 100#define STACKINCREMENT 20using namespace std;/* 定义字符类型栈*/template<class T>class Stack{int stacksize;T *base;T *top;public:int InitStack(){base=(T *)malloc(STACK_INIT_SIZE*sizeof(T));if(!base) return ERROR;top=base;stacksize=STACK_INIT_SIZE;return OK;}void Push(T ch) //运算符栈插入ch为新的栈顶元素{*(++top)=ch;}T Pop() //删除运算符栈s的栈顶元素,用p返回其值{return *(top--);}T GetTop()//用p返回运算符栈s的栈顶元素{return *top;}};/* 定义整型栈*//* ----------------- 全局变量--------------- */Stack<char> OPTR;/* 定义运算符栈*/Stack<int> OPND; /* 定义操作数栈*/char expr[255] = ""; /* 存放表达式串*/char *ptr = expr;int In(char ch) //判断字符是否是运算符,运算符即返回1{return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#'); }/* 判断运算符优先权,返回优先权高的*/char Precede(char c1,char c2){int i=0,j=0;static char array[49]={'>', '>', '<', '<', '<', '>', '>','>', '>', '<', '<', '<', '>', '>','>', '>', '>', '>', '<', '>', '>','>', '>', '>', '>', '<', '>', '>','<', '<', '<', '<', '<', '=', '!','>', '>', '>', '>', '!', '>', '>','<', '<', '<', '<', '<', '!', '='};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 '(' : j=4;break;case ')' : j=5;break;case '#' : j=6;break;}return (array[7*i+j]); /* 返回运算符*/ }/*操作函数*/int Operate(int a,char op,int b){switch(op){case '+' : return (a+b);case '-' : return (a-b);case '*' : return (a*b);case '/' : return (a/b);}return 0;}int EvalExpr()//主要操作函数{char c,theta,x; int m;int a,b,i=0;while(*ptr!='#'||OPTR.GetTop()!='#'){c = *ptr;if(!In(c)){sscanf(ptr,"%d",&m);OPND.Push(m);while(!In(*ptr))ptr++;}elseswitch(Precede(OPTR.GetTop(),c)){case '<':OPTR.Push(c);*ptr++;break;case '=':x=OPTR.Pop();*ptr++;break;case '>':theta=OPTR.Pop();b=OPND.Pop();a=OPND.Pop();OPND.Push(Operate(a,theta,b));break;}}return OPND.GetTop();}int main( ){cout<<"请输入正确的表达式以'#'结尾:";do{gets(expr);}while(!*expr);OPTR.InitStack();OPND.InitStack();OPTR.Push('#'); /* 将#压入运算符栈*/cout<<"表达式结果为:"<<EvalExpr()<<'\n';cout<<" ***吴玲婷制作*****2013.12.31***\n ";cout<<" ***感谢收听***\n";return 0;}4、测试1.登录成功后的界面:2.输入正确的表达式之后:更换表达式后的结果:5、总结这次课程设计让我更加了解大一学到的面向对象C++和C以及这个学期学到的数据结构。