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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算术表达式求值演示课程设计报告.docx

1、算术表达式求值演示课程设计报告题目:算术表达式求值演示班级:031021班 姓名:李鑫 学号:03102067 完成日期:2011.12一、 需求分析1. 问题描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个经典例子。设计一个程序演示用算符优先法对算术表达式求值的过程。2. 基本要求:利用教科书表3.1给出的算符优先关系,实现对算术四则混合运算表达式的求值。3. 测试数据:教科书例3-1的算术表达式3*(7-2)。二、 概要分析栈的抽象数据类型定义ADT SqStack数据对象:D=ai| ai ElemSet,i=1,2,3,n,n0数据关系:R1=| ai-1,ai D

2、,i=1,2,3,,n 约定其中ai端为栈底,an端为栈顶。 操作集合:(1)void InitStack1(SqStack1 &S1);/声明栈建立函数(2)void InitStack2(SqStack2 &S2);/声明栈建立函数(3)void evaluate(SqStack1 &S1,SqStack2 &S2);/确定如何入栈函数(4)void Push1(SqStack1 &S1,char e);/声明入栈函数(5)void Push2(SqStack2 &S2,float e);/声明入压栈函数(6)char GetTop1(SqStack1 &S1);/声明取栈顶元素函数(7)

3、float GetTop2(SqStack2 &S2);/声明取栈顶元素函数(8)char Pop1(SqStack1 &S1);/声明出栈函数(9)float Pop2(SqStack2 &S2);/声明出栈函数(10)char Compare(char m,char n);/声明比较函数(11)float Operate(float a,char rheta,float b);/声明运算函数(12)void DispStack1(SqStack1 &S1);/从栈底到栈顶依次输出各元素(13)void DispStack2(SqStack2 &S2);/从栈底到栈顶依次输出各元素 ADT

4、SqStack三、 详细设计源程序#includeusing namespace std;#define STACK_INIT_SIZE 100#define 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)

5、;/声明栈建立函数void evaluate(SqStack1 &S1,SqStack2 &S2);/确定如何入栈函数void Push1(SqStack1 &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,cha

6、r n);/声明比较函数float Operate(float a,char rheta,float b);/声明运算函数void DispStack1(SqStack1 &S1);/从栈底到栈顶依次输出各元素void DispStack2(SqStack2 &S2);/从栈底到栈顶依次输出各元素/*主函数*/void main() SqStack1 S1;/定义运算符栈 SqStack2 S2;/定义运算数栈 /freopen(data1.in,r,stdin); /freopen(data1.out,w,stdout); InitStack1(S1);/调用栈建立函数 InitStack2

7、(S2);/调用栈建立函数 evaluate(S1,S2);/调用确定如何入栈函数 cout按任意键结束!endl; /*运算符栈函数*/void InitStack1(SqStack1 &S1)/构造一个空栈S1 S1.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存储

8、分配失败!; 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)coutnttt运算符栈已空!n; else e=*(S1.top-1); return e;void DispStack1(SqStack1 &S1)/从栈底到栈顶依次输出各元素 char e,*p; if(S1.top=S1.base

9、)cout ; else p=S1.base; while(pS1.top) e=*p; p+; coute; char Pop1(SqStack1 &S1)/出栈 char e; if(S1.top=S1.base)coutnttt运算符栈已空!n; e=*(-S1.top); return e;/*运算数栈函数*/void InitStack2(SqStack2 &S2)/构造一个空栈S2 S2.base=(float *)malloc(STACK_INIT_SIZE *sizeof(float); if(!S2.base)cout=S2.stacksize)/栈满,追加存储空间 S2.b

10、ase=(float *)realloc(S2.base,(S2.stacksize+STACKINCREMENT)*sizeof(float); if(!S2.base)cout存储分配失败!; else S2.top=S2.base+S2.stacksize; S2.stacksize=S2.stacksize+STACKINCREMENT; *S2.top=e;S2.top=S2.top+1;/将元素e入栈,指针上移void DispStack2(SqStack2 &S2)/从栈底到栈顶依次输出各元素 float e,*p; if(S2.top=S2.base)cout ; else p

11、=S2.base; while(pS2.top) e=*p; p+; coute; float GetTop2(SqStack2 &S2)/取栈顶元素 float e; if(S2.top=S2.base) coutntt运算数栈已空!; else e=*(S2.top-1); return e;float Pop2(SqStack2 &S2)/出栈 float e; if(S2.top=S2.base)coutntt运算数栈已空!; e=*(-S2.top); return e;/*确定如何入栈函数*/void evaluate(SqStack1 &S1,SqStack2 &S2) char

12、 c; float t,e; int n=0,i=1,j=0,k=0,l=0; char chSTACK_INIT_SIZE; int s=1; int flag=0,flag2=0; float p1,p2; char ch1; Push1(S1,#);/将#入栈,作为低级运算符 coutch; c=ch0; coutn对表达式求值的操作过程如下: n_n 步骤t运算符栈S1t运算数栈S2t输入字符tt主要操作; while(c!=#|GetTop1(S1)!=#) coutn_n; couti+t; DispStack1(S1);couttt; DispStack2(S2); couttt

13、; if(flag=1) k-; flag=0; if(flag2) k+=flag2; flag2=0; for(l=0;lk;l+) cout ; for(j=k;chj!=0;j+) cout=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; c=chs+; if(c=.) n=-1; c=chs+; if(c=0&c=9)|c=.) flag2+; goto as; if(c9) Push2(S2,t); coutttPush2(S2,t);

14、else/输入的是运算符 n=0;/非运算型数据计数器清零 switch(Compare(GetTop1(S1),c)/比较运算符的优先级 case :/栈顶元素优先级低,则入栈且继续输入 Push1(S1,c); coutttPush1(S1,c); c=chs+; break; case =:/栈顶元素优先级相等,脱括号并接收下一字符 Pop1(S1); cout:/栈顶元素优先级高,则退栈并将运算结果入栈 p1=Pop2(S2); p2=Pop2(S2); ch1=Pop1(S1); Push2(S2,Operate(p2,ch1,p1); coutttOperate(p2,ch1,p1

15、); flag=1; break; coutn_n; coutit#ttGetTop2(S2)tt; for(j=0;jk;j+) cout ; cout#ttRETURN(GETTOP(S2); coutn_n; if(S2.top-1=S2.base)/显示表达式最终结果 coutn表达式的结果为:GetTop2(S2)endl; else coutn表达式出错!n;char Compare(char m,char n)/运算符的优先级比较 if(n=+|n=-)/输入符号为+、- if(m=(|m=#)return ;/栈顶元素为(、#,此时栈顶符号优先级低,返回;/否则,栈顶符号优先级

16、高,返回 else if(n=*|n=/)/输入的符号为*、/ if(m=)|m=*|m=/)return ;/栈顶元素为)、*、/,此时栈顶符号优先级高,返回 else return ;/否则,栈顶符号优先级低,返回 else if(n=()return;/输入的符号为(,则直接返回;/否则,栈顶符号优先级高,返回 else /输入符号为其他 if(m=#)return=;/栈顶元素为#,此时优先级同,返回= else return ;/否则,栈顶符号优先级高,返回 float Operate(float a,char theta,float b)/运算函数 float tmp=0; if

17、(theta=+)tmp=a+b;/从运算符栈取出的符号为+,则运算数栈的两元素相加,并返回 else if(theta=-)tmp=a-b;/从运算符栈取出的符号为-,则运算数栈的两元素相减,并返回 else if(theta=*)tmp=a*b;/从运算符栈取出的符号为*,则运算数栈的两元素相乘,并返回 else if(theta=/) /从运算符栈取出的符号为/,则运算数栈的两元素相除,并返回 if(b=0) coutn表达式出错!除数不能为0!n; else tmp=a/b; return tmp;四.调试分析五、 总结与心得经过两个星期的实际操作和搜索相关资料,终于让我完成了任务。让

18、我对数据结构C语言有了更进一步的认识和了解,也让我知道,要想学好它要重在实践,理论与实际应用相结合,提高了自己组织数据及编写大型程序的能力,培养了基本的、良好的程序设计技能以及合作能力。通过实际操作,我也发现我的好多不足之处:(1)用栈的结构来解决表达式的求值,首先要解决的问题是如何将人们习惯书写的表达式转换成计算机容易处理的表达式。开始有些茫然,后来通过结合课本和同学的帮助完成了该课题。(2)对一些看似简单的东西掌握不够熟练,比如由于函数的调用参数问题不熟而造成了调试的困难。对于语法的掌握也欠缺成熟,需要进一步掌握。(3)栈的结构理解不够清晰,造成了设计程序时理不清头绪,需要对数据结构有更深层次的理解。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1