ImageVerifierCode 换一换
格式:DOCX , 页数:7 ,大小:17.25KB ,
资源ID:6606163      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-6606163.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计报告表达式求值问题.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计报告表达式求值问题.docx

1、数据结构课程设计报告表达式求值问题数据结构课 程 设 计 报 告题 目: 表达式求值问题 学院(系): 数学与计算科学学院班 级: 11级信息与计算科学4班 学生学号: 1107020432 姓 名: 杨宇红 指导教师: 彭叶辉 2013年 6月28 日摘要2一、需求分析2二、概要设计2三、详细设计51、预定义和定义结构体 52、基本操作的算法描述 53、判断输入的运算符是否在运算符允许范围内 64、比较运算符间的优先关系 75、确定两运算数之间的运算符后进行运算,并返回两操作数运算后的结果 76、提示用户按照要求输入正确的表达式 87、遵循算术运算规则求解表达式 98、输出运算结果 9四、设

2、计和调试分析9五、用户手册10六、测试结果10七、设计心得12八、参考文献12九、附录12摘 要通过数据结构这门课程,我们较深入的了解到了栈,栈是一种重要的线性结构,它广泛应用于各种软件系统中,因此在面向对象的程序设计中,它们是多型数据类型。栈是限定仅在表尾进行插入或删除操作的线性表。因此,栈又称为后进先出的线性表。它的这个特点可以应用于多种实际问题,比如数制转换、括号匹配的检验、行编辑程序、迷宫求解以及表达式求值等问题。本次试验我们将探索表达式求值问题,表达式求值是程序设计语言编译中的一个最基本的问题,它的实现是栈应用的又一个典型的例子。通过实验我们能用程序计算带括号的表达式,在过程中更深入

3、的了解到栈的基本操作。关键词:栈、先进后出、带括号的表达式、表达式求值、一、需求分析 本程序用于解决一个可以带括号的表达式求值的问题,要运用到栈,而且会用到一种简单直观,广为使用的算法,通常称为“算符优先法”。进行表达式求值首先要了解算术四则运算的规则。即:(1)先乘除,后加减;(2)从左算到右;(3)先括号内后括号外;算符优先法根据这个算符优先关系的规定来实现对表达式的编译或解释执行的。任何一个表达式都是由操作数、运算符和界限符组成。为实现算符优先算法,可以使用两个工作栈。一个称作OPTR,用以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。算法的基本思想是:(1)首先置操作数栈为

4、空栈,表达式起始符“#”为运算符的栈底元素;(2)一次读入表达式中每个字符,若是操作数则进OPND栈若是运算符则和OPTR栈的栈顶元素比较优先权后做相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“#”)。界面要求使用VC+6.0的运行环境。二、概要设计1、栈抽象数据类型的定义如下:ADT Stack数据对象:D=ai|aiElemSet, i=1,2, ,n, n0数据关系:R1=|ai-1,aiD, i=1,2, ,n 约定an端为栈顶,a1端为栈底。基本操作:InitStack( &S )操作结果:构造一个空栈S。DestroyStack ( &S )初始条件

5、:栈S已存在。操作结果:销毁栈S。ClearStack( &S )初始条件:栈S已存在。操作结果:将S清为空栈。StackEmpty( S )初始条件:栈S已存在。操作结果:若S为空栈,则返回TRUE,否则返回FALSE。StackLength( S )初始条件:栈S已存在。操作结果:返回S的数据元素个数,即栈的长度。GetTop( S, &e )初始条件:栈S已存在且非空。操作结果:用e返回S的栈顶元素。Push( &S, e )初始条件:栈S已存在。操作结果:插入元素e为新的栈顶元素。Pop( &S, &e )初始条件:栈S已存在且非空。操作结果:删除S的栈顶元素,并用e返回其值。Stac

6、kTraverse( S, visit() )初始条件:栈S已存在且非空。操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit()。一旦visit()失败, 则操作失败。ADT Stack2、本程序调用的函数如下:char Precede(char a,char b);/用于比较运算符间优先关系float yunsuan(float a,char zhi , float b);确定a、b间的运算数符运算a、b两个运算数并将结果赋给zhi float EvalueateExpression(sqstack OPND,Sqstack OPTR);/算术表达式求值的算符优先算法。设OPTR

7、和OPND分别为运算栈符和运算数符printf(请输入表达式并以#结束,其中数字在1-9中选择n);/打印出界面提示printf(结果是:%.2fn,m);/打印出结果int In(char c);/判断运算符的是否符合条件3、栈基本操作的函数调用int Initstack1(Sqstack &OPTR);/构造一个空栈OPTRint Push(Sqstack &OPTR,char e);/插入元素e为新的栈顶元素int Pop(Sqstack &OPTR,char &e);/若栈不空,则删除OPTR的栈顶元素,用e返回其值,并返回OK;否则返回ERRORchar GetTop1(Sqstac

8、k &OPTR);/若栈不空,则返回s的栈顶元素,并返回OK;否则返回ERROR4、主函数int main()float m;Sqstack OPTR;sqstack OPND;Initstack(OPND);Initstack1(OPTR);printf(请输入表达式并以#结束,其中数字在1-9中选择n);m=EvalueateExpression(OPND,OPTR);printf(结果是:%.2fn,m);return 0;三、详细设计1、预定义和定义结构体#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVER

9、FLOW -2#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef structfloat *base;float *top;int stacksize;sqstack;typedef structchar *base;char *top;int stacksize;Sqstack;2、基本操作的算法描述int Initstack(sqstack &S)/构造一个空栈sS.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float);if(!S.base)exit(OVERFLOW

10、);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;int Push(sqstack &S,float e)/插入元素为e的栈顶元素if(S.top-S.base=S.stacksize)/栈满,追加存储空间S.base=(float *)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(float);if(!S.base)exit (OVERFLOW);/存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.t

11、op+=e;return OK;int Pop(sqstack &S,float &e)/若栈不空,则删除s的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top=S.base)return ERROR;e=*-S.top;return OK;float GetTop(sqstack &S, float &e)/若栈不空,则用e返回s的栈顶元素,并返回OK;否则返回ERRORif(S.top=S.base)return ERROR;e= *(S.top-1);return OK;3、判断输入的运算符是否在运算符允许范围内int In(char c)if(c=+|c=-|c=*|c=/|c=#|c=(|c=)/表达式中可以出现的运算符return TRUE;elsereturn FALSE;4、比较运算符间的优先关系char Precede(char a,char b)int i,j;char op88= ,+,-,*,/,(,),#,+, -,*,/,(, ,#, ,=;/OP为运算符集合 运算符间的优先关系

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2