《数据结构课程设计》表达式求值实验报告.doc
《《数据结构课程设计》表达式求值实验报告.doc》由会员分享,可在线阅读,更多相关《《数据结构课程设计》表达式求值实验报告.doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验课程名称 专 业 班 级 学 生 姓 名 学 号 指 导 教 师 20 至 20 学年第 学期第 至 周算术表达式求值演示1、 概述 数据结构课程设计.要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面.加深对课程基本内容的理解。同时.在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的基本问题之一.也是栈的应用的一个典型例子。设计一个程序.演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性.以便在解决实际问题中灵活运用它们.同时加深对这
2、种结构的理解和认识。二、 系统分析1 以字符列的形式从终端输入语法正确的、不含变量的整数表达式。利用已知的算符优先关系.实现对算术四则混合运算表达式的求值.并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。2 一般来说.计算机解决一个具体问题时.需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型.然后设计一个解决此数学模型的算法.最后编出程序.进行测试.调试直至得到想要的答案。对于算术表达式这个程序.主要利用栈.把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法.可以使用两个栈.一个用以寄存运算符.另一个用以寄存操作数和运算结果。3 演示程序是以用户
3、于计算机的对话方式执行.这需要一个模块来完成使用者与计算机语言的转化。4 程序执行时的命令: 本程序为了使用具体.采用菜单式的方式来完成程序的演示.几乎不用输入什么特殊的命令.只需按提示输入表达式即可。(要注意输入时格式.否者可能会引起一些错误)5. 测试数据。三、 概要设计一个算术表达式中除了括号、界限符外.还包括运算数据和运算符。由于运算符有优先级别之差.所以一个表达式的运算不可能总是从左至右的循序执行。每次操作的数据或运算符都是最近输入的.这与栈的特性相吻合.故本课程设计借助栈来实现按运算符的优先级完成表达式的求值计算。算法设计程序包含三个模块(1) 主程序模块.其中主函数为void m
4、ain输入表达式;根据要求进行转换并求值;输出结果;(2) 表达式求值模块实现具体求值。(3) 表达式转换模块实现转换。各个函数之间的调用关系主函数表达式转换表达式求值数据输入输出输出 栈的抽象数据类型定义ADT SqStack数据对象:D=ai| ai ElemSet,i=1,2,3.n,n0数据关系:R1=| ai-1,ai D,i=1,2,3,.n 约定其中ai端为栈底.an端为栈顶。 操作集合:(1)void InitStack1(SqStack1 &S1);/声明栈建立函数(2)void InitStack2(SqStack2 &S2);/声明栈建立函数(3)void evaluat
5、e(SqStack1 &S1,SqStack2 &S2);/确定如何入栈函数(4)void Push1(SqStack1 &S1,char e);/声明入栈函数(5)void Push2(SqStack2 &S2,float e);/声明入压栈函数(6)char GetTop1(SqStack1 &S1);/声明取栈顶元素函数(7)float GetTop2(SqStack2 &S2);/声明取栈顶元素函数(8)char Pop1(SqStack1 &S1);/声明出栈函数(9)float Pop2(SqStack2 &S2);/声明出栈函数(10)char Compare(char m,ch
6、ar n);/声明比较函数(11)float Operate(float a,char rheta,float b);/声明运算函数(12)void DispStack1(SqStack1 &S1);/从栈底到栈顶依次输出各元素(13)void DispStack2(SqStack2 &S2);/从栈底到栈顶依次输出各元素 ADT SqStack结构分析:栈中的数据节点是通过数组来存储的。因为在C语言中数组是用下标从零开始的.因此我们在调用他们的数据是要特别注意。指针变量的值要么为空(NULL).不指向任何结点;要么其值为非空.即它的值是一个结点的存储地址。注意.当P为空值时.则它不指向任何结
7、点.此时不能通过P来访问结点.否则会引起程序错误。如果输入的数字不符合题目要求.则会产生错误结果。算法的时空分析:时间和空间性能分析:时间上.对于含n个字符的表达式.无论是对其进行合法性检测还是对其进行入栈出栈操作n次.因此其时间复杂度为O(n)。空间上.由于是用数组来存储输入的表达式.用栈来存储运算中的数据和运算符.而栈的本质也用到的数组.数组在定义时必须确定其大小。在不知表达式长度的情况下确定数组的长度确非易事.此时极易造成空间的浪费.因此空间性能不是很好。四、 详细设计源程序#includeusing namespace std;#define STACK_INIT_SIZE 100#d
8、efine STACKINCREMENT 10typedef 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 &
9、S1,char e);/声明入栈函数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(SqS
10、tack1 &S1);/从栈底到栈顶依次输出各元素void DispStack2(SqStack2 &S2);/从栈底到栈顶依次输出各元素/*主函数*/void main()SqStack1 S1;/定义运算符栈SqStack2 S2;/定义运算数栈/freopen(data1.in,r,stdin);/freopen(data1.out,w,stdout);InitStack1(S1);/调用栈建立函数InitStack2(S2);/调用栈建立函数evaluate(S1,S2);/调用确定如何入栈函数cout按任意键结束!endl;/*运算符栈函数*/void InitStack1(SqSt
11、ack1 &S1)/构造一个空栈S1S1.base=(char *)malloc(STACK_INIT_SIZE *sizeof(char);if(!S1.base)cout=S1.stacksize)/如果栈满.追加存储空间S1.base=(char *)realloc(S1.base,(S1.stacksize+STACKINCREMENT)*sizeof(char);if(!S1.base)cout存储分配失败!;elseS1.top=S1.base+S1.stacksize;S1.stacksize=S1.stacksize+STACKINCREMENT;*S1.top=e;S1.to
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计 数据结构 课程设计 表达式 求值 实验 报告
限制150内