《数据结构 课程设计表达式求值 实验报告》由会员分享,可在线阅读,更多相关《数据结构 课程设计表达式求值 实验报告(21页珍藏版)》请在人人文库网上搜索。
1、实验课程名称 级 专业班 名姓 学生 号学 指导 教 师 20至 20 学年第学期第至周 0算术表达式求值演示 1、概述 数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算 法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基 本技能和科学作风方面受到比较系统和严格的训练。 在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的 基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求 值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构。
2、 的理解和认识。 二、 系统分析 1 以字符列的形式从终端输入语法正确的、不含变量的整数表达式。利用已知的算符 优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例子在求值中 运算符栈、运算数栈、输入字符和主要操作的变化过程。 2 一般来说,计算机解决一个具体问题时,需要经过几个步骤:首先要从具体问题抽 象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编出程序, 进行测试,调试直至得到想要的答案。对于算术表达式这个程序,主要利用栈,把 运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法,可以使用两个 栈,一个用以寄存运算符,另一个用以寄存操作数和运算结果。 3 。
3、演示程序是以用户于计算机的对话方式执行,这需要一个模块来完成使用者与计算 机语言的转化。 4 程序执行时的命令: 本程序为了使用具体,采用菜单式的方式来完成程序的演示,几乎不用输入什么特 殊的命令,只需按提示输入表达式即可。(要注意输入时格式,否者可能会引起一些错 误) 测试数据。5. 1三、 概要设计 一个算术表达式中除了括号、界限符外,还包括运算数据和运算符。由于运算符有优先级别之 差,所以一个表达式的运算不可能总是从左至右的循序执行。每次操作的数据或运算符都是最近输 入的,这与栈的特性相吻合,故本课程设计借助栈来实现按运算符的优先级完成表达式的求值计算。 算法设计 程序包含三个模块 (1。
4、) 主程序模块,其中主函数为 void main 输入表达式; 根据要求进行转换并求值; 输出结果; 体求值。表达式求值模块实现具(2) 换。表达式转换模块(3) 实现转 各个函数之间的调用关系 主函数 表达式转换 数据输入表达式求值 输出 输出 2栈的抽象数据类型定义 ADT SqStack 数据对象:D=a| aElemSet,i=1,2,3,n,n0 i i 数据关系:,a | a ,D,i=1,2,3,,n i-1iii-1R1= using namespace std; #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typ。
5、edef 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(SqStack1 &S1,char e);/声。
6、明入栈函数 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 DispStack1(SqStack1。
7、 &S1);/从栈底到栈顶依次输出各元素 void DispStack2(SqStack2 &S2);/从栈底到栈顶依次输出各元素 /*主函数*/ void main() 4SqStack1 S1;/定义运算符栈 SqStack2 S2;/定义运算数栈 /freopen(data1.in,stdin); /freopen(data1.out,w,stdout); InitStack1(S1);/调用栈建立函数 InitStack2(S2);/调用栈建立函数 evaluate(S1,S2);/调用确定如何入栈函数 潣瑵?按任意键结束!=S1.stacksize)/如果栈满,追加存储空间 S1.b。
8、ase=(char *)realloc(S1.base,(S1.stacksize+STACKINCREMENT)*sizeof(char); if(!S1.base) 潣瑵?存储分配失败!; else S1.top=S1.base+S1.stacksize; S1.stacksize=S1.stacksize+STACKINCREMENT; *S1.top=e;S1.top=S1.top+1;/将元素压入栈中,指针上移 char GetTop1(SqStack1 &S1)/取栈顶元素 char e; if(S1.top=S1.base)cout=S2.stacksize)/栈满,追加存储空间。
9、 S2.base=(float *)realloc(S2.base,(S2.stacksize+STACKINCREMENT)*sizeof(float); 晩?戮獡?潣瑵?存储分配失败!; else S2.top=S2.base+S2.stacksize; S2.stacksize=S2.stacksize+STACKINCREMENT; *S2.top=e;S2.top=S2.top+1;/将元素 e 入栈,指针上移 6 void DispStack2(SqStack2 &S2)/从栈底到栈顶依次输出各元素 float e,*p; if(S2.top=S2.base)coutch; c=c。
10、h0; 7潣瑵?屜n对表达式求值的操作过程如下: =0) e=float(c-48); n+; if(n=1)t=e; else 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&c9) Push2(S2,t); cout:/栈顶元素优先级高,则退栈并将运算结果入栈 p1=Pop2(S2); p2=Pop2(S2); ch1=Pop1(S1); Push2(S2,Operate(p2,ch1,p1); cout;/否则,栈顶符号优先级高,返回? else。
11、 if(n=*|n=/)/输入的符号为?、屜尯 if(m=)|m=*|m=/)return ;/栈顶元素为尩、?、/,此时栈顶符号优先 级高,返回? else return ;/否则,栈顶符号优先级高,返回? else 输入符号为其他/ #,此时优先级同,返回?元素为if(m=#)return=;/栈顶 ?否则,栈顶符号优先级高else return ;/,返回 theta,floatOperate(float float a,char b)/运算函数 10 float tmp=0; if (theta=+)tmp=a+b;/从运算符栈取出的符号为尫,则运算数栈的两元素相加,并 返回 else。
12、 if(theta=-)tmp=a-b;/从运算符栈取出的符号为?,则运算数栈的两元素相减,并 返回 else if(theta=*)tmp=a*b;/从运算符栈取出的符号为?,则运算数栈的两元素相乘,并 返回 else if(theta=/) /从运算符栈取出的符号为屜尯,则运算数栈的两元素相除,并 返回 if(b=0) cout表达式出错!除数不能为 0!n; else tmp=a/b; return tmp; 五、运行与测试 第六章 总结与心得 数据结构的研究不仅涉及到计算机硬件的研究,而且和计算机软件的研究有着更密切的关系, 无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配。
13、问题。在研究信息检索时也必 须考虑如何组织数据,以便使查找和存取数据元素更为方便。 在课程设计中,应该力求算法简明易懂,而易于转换为上机程序;如果程序反复多次使用,则 应该尽可能选用快速的算法;如果待解决的问题数据量极大,机器的存储空间较小,则在编写算法 时应该考虑如何节省空间。以后在编写程序时就应该注意到所编写程序的时间复杂度,以及是否运 用了良好的算法,而不能只是像以前编写程序时单纯使用 C 语言的知识,要充分考虑程序的性能, 争取编写出更优良的程序来。 让我对数据结构有了更进一步的认识和了解,也让我知道,要想学好它要重在实践,理论与实 际应用相结合,提高了自己组织数据及编写大型程序的能力,培养了基本的、良好的程序设计技能 力。通过实际操作,我也发现我的好多不足之处: (1)用栈的结构来解决表达式的求值,首先要解决的问题是如何将人们习惯书写的表达式转换成计 11算机容易处理的表达式。开始有些茫然,后来通过结合课本和同学的帮助完成了该课题。 (2)对一些看似简单的东西掌握不够熟练,比如由于函数的调用参数问题不熟而造成了调试的困难。 对于语法的掌握也欠缺成熟,需要进一步掌握。 (3)栈的结构理解不够清晰,造成了设计程序时理不清头绪,需要对数据结构有更深层次的理解。 13。