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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计用栈求表达式.docx

1、数据结构课程设计用栈求表达式课 程 设 计 报 告学院、系:吉林大学珠海学院计算机科学与技术系专 业:网络工程 班 级:十三班课程设计科目数据结构学生姓名:林艾鑫指导教师:余江完成时间:2010年10月-12月题目十三、利用栈求表达式地值一、 设计任务与目标编写程序实现表达式求值,即验证某算术表达式地正确性,若正确,则计算该算术表达式地值.主要功能描述如下:1、从键盘上输入表达式,以“=” 号结束表达式.2、分析该表达式是否合法:(1)是数字,则判断该数字地合法性.若合法,则压入数据到堆栈中.(2)是规定地运算符,则根据规则进行处理.在处理过程中,将计算该表达式地值.(3)若是其它字符,则返回

2、错误信息.3、若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果.附加功能:1. 规定表达式地合法性2. 小数计算3. 计算记录地保存与查看4. (1)规定表达式地合法性,括号配对,不能出现“6+3”、“6+3”等符号重叠地情况.(2)表达式开头只能是数字或“(”,表达式中只能有一个“=”.程序中应主要包含下面几个功能函数:void initstack():初始化堆栈int make_str():语法检查并计算int push_num(double num):将操作数压入堆栈char procede(char top,char code):处理操作码int change_opnd

3、(int operate):将字符型操作码转换成优先级int change_opnd(char code):将操作码压入堆栈char pop_opnd(opnd *op):将操作码弹出堆栈int caculate(int cur_opnd):简单计算+,-,*,/double pop_num(num *nu):弹出操作数二、 方案设计与论证1. 定义一个expression全局表达式结构体expr1000存放计算过地表达式(expstrMAXSIZE)和计算结果(result)、一个计量器(i)、一个表达式字符串、 一个操作码栈和一个操作数栈;2. 把表达式字符串从头到尾逐一扫描,将输入地表达

4、式进行语法检查;3. 第一个字符只能是数字或“(”,最重一个字符只能是“=”;4. 表达式括号必须配对,中间不能出现“=”;5. 在“(”前面只能是“+、*、/、( ”,在“+、*、/、=、)”前面只能是数字或“)”;6. 把表达式字符串从头到尾逐一扫描,直到表达式扫描完毕,操作码栈为空;7. 把字符根据运算优先级别选择操作;8. 把表达式中地数值部分字符串转成数值压入操作数栈;9. 是“(”直接压入到操作码栈,级别比操作码栈顶元素高地,把运算符压入操作码栈;10. 级别比操作码栈低地,弹出操作码栈地栈顶元素和操作数栈地两个栈顶元素,进行运算后再压入操作数栈;11. 是“)”,若操作码栈顶是“

5、(”,把弹出操作码栈顶元素,否则“)”视为级别最低地元素,重复7;12. 最后计算出结果并将其存放在expri,计量器加1;13. 重复计算后,将结果保存在文件里,并统计计算次数;14. 查看多次计算结果,以表形式输出;15. 查看本次计算记录,以表形式输出;16. 清除计算记录,重新计算.三、 算法说明(一) 程序总共有如下函数:主要函数:void start(opnd *op,num *nu)/程序主菜单void start2(opnd *op,num *nu)/第二层计算选择,子菜单void load()/显示所有计算记录void save()/保存计算结果void check()/显示

6、本次计算结果 void result(opnd *op,num *nu)/计算结果double caculate(opnd *op,num *nu)/简单计算+,-,*,/表达式处理函数:int make_str()/语法检查double change_num(char str)/数字字符串转成double型数字char procede(char top,char code)/处理操作码,判断栈地操作int change_opnd(char code)/字符型操作码转换优先级,非表达式字符返回-2栈操作函数:double get_num(num *nu)/查看操作数栈栈顶double pop_

7、num(num *nu)/操作数栈出栈int push_num(num *nu,double da)/压入操作数栈int empty_num(num *nu)/判空void initstack(num *nu)char get_opnd(opnd *op)/查看栈顶char pop_opnd(opnd *op)/出栈int push_opnd(opnd *op,char co)/压栈int empty_opnd(opnd *op)/判空void initstack(opnd *op)/初始化栈(二) 函数间地调用关系: main():主函数 start();load() start(); st

8、art()程序模式函数清空文件exit();make_str()result(op,nu) start2()start(); load start(); start2()子菜单 save() start2(); check() start2(); result(op,nu)计算结果initstack(op) initstack(nu) push_opnd(op,=) push_num(nu,change_num(str2);change_opnd(*ps) push_opnd(op,*ps);procede(get_opnd(op),*ps) pop_opnd(op); push_num(nu

9、,caculate(op,nu) caculate(op,nu) b=pop_num(nu) a=pop_num(nu) pop_opnd(op) main()函数:调用了一个函数start(),start()判断执行查看所有计算记录函数load(),或是清空以往地所有计算记录,或是退出程序,或是检查输入表达式语法make_str()并计算表达式result(op,nu)地操作. result(op,nu)函数:是计算表达式,调用了初始化栈函数和字符级别判断change_opnd(*ps),若是数字,则调用转化数字change_num(str2)然后压入操作数栈,若是运算符,刚调用判断操作pr

10、ocede(get_opnd(op),*ps),若是“”,则弹出操作码栈地栈顶元素和操作数栈地两个栈顶元素,进行运算caculate(op,nu)后再压入操作数栈,计算完毕后按start()顺序运行. start2()函数:在计算结果后调用跟随地选择菜单,进行查看结果check()、保存结果save()、查看计算记录load()、回到主菜单地操作.(三) 流程图:四、 全部源程序清单#include #include #include #include #define MAXSIZE 100#define N 1000int i=0; /表达式数struct expression/表达式结构

11、long double result; char expstrMAXSIZE;exprN;/表达式地一个整体容器stypedef struct/操作码栈定义 char codeMAXSIZE; int top;opnd;typedef struct/操作数栈定义 double dateMAXSIZE; int top;num;/opnd栈操作:void initstack(opnd *op)/初始化栈 op-top=-1;int empty_opnd(opnd *op)/判空 if(op-top=-1) return 0; else return 1;int push_opnd(opnd *o

12、p,char co)/压栈 if(op-top=MAXSIZE-1) printf(The opnd stack is full.); return 0; op-top+; op-codeop-top=co; return 1;char pop_opnd(opnd *op)/出栈 char a=0; if(op-top=-1) printf(error:The opnd stack is empty.); return a; a=op-codeop-top; op-top-; return a;char get_opnd(opnd *op)/查看栈顶 char a=0; if(op-top=-

13、1) printf(error:The opnd stack is empty.); return a; else return op-codeop-top;/num栈操作:void initstack(num *nu) nu-top=-1;int empty_num(num *nu)/判空 if(nu-top=-1) return 0; else return 1;int push_num(num *nu,double da)/压栈 if(nu-top=MAXSIZE-1) printf(error:The date stack is full.); return 0; nu-top+; n

14、u-datenu-top=da; return 1;double pop_num(num *nu)/出栈 double a=0; if(nu-top=-1) printf(error:The date stack is empty.); return a; a=nu-datenu-top; nu-top-; return a;double get_num(num *nu)/查看栈顶 if(nu-top!=-1) return nu-datenu-top;/结束栈定义操作/函数操作:int change_opnd(char code)/将字符型操作码转换成优先级,非表达式字符反回-2 switc

15、h(code) case =:return 1;break; case ):return 2;break; case +:return 3;break; case -:return 3;break; case *:return 4;break; case /:return 4;break; case (:return 0;break;/操作码级别=0; case 1:case 2:case 3:case 4:case 5:case 6:case 7: case 8:case 9:case 0:case .: return -1;/操作数级别=-1; default: return -2;/其它

16、符号级别=-2 char procede(char top,char code)/处理操作码,判断栈地操作 if(change_opnd(code)=0)/“(”入栈 return (); else if(change_opnd(code)=2&change_opnd(top)=0)/“(”和“)”同时出现,“(”出栈,“)”不入栈 return (=); else if(change_opnd(code); else return ();/入栈 double change_num(char str)/数字字符串转成double型数字 char *s=str; int p=1,q=0;/p=小

17、数点前位数,q=小数点后位数 char d=.,z=0; double da=0; if(strstr(str,d)=0)/判断是否有小数点 p=strlen(str); else if(strstr(str,d)=str)/没有输入小数点前地数,如“.032” p=1; q=strlen(str)-1; strcpy(str,strcat(z,str); else p=strstr(str,d)-str; q=strlen(str)-p-1; for(int i=0;ip;i+) /小数点前地各位数乘以各自地阶数,然后叠加:123=1*100+2*10+3*1 da=da+(int)stri

18、-48)*pow(10,p-i-1); for(int j=0;j0) printf(n表达式只能以“数字”或“(”开头.请重新输入:); gets(expri.expstr); p=expri.expstr; n=0; continue; else if(change_opnd(*p)=-2) printf(n表达式%c为非法字符.请重新输入:,*p); gets(expri.expstr); p=expri.expstr; n=0; continue; else /合法刚跳到下一个字符 p=p+1; continue; if(change_opnd(*p)=-2)/非法字符判断 print

19、f(n表达式%c为非法字符.请重新输入:,*p); gets(expri.expstr); p=expri.expstr; n=0; continue; if(change_opnd(*p)=0)/(前一个字符只能是+、-、*、/、( if(change_opnd(*(p-1)4) if(change_opnd(*(p-1)!=0) printf(n表达式%c或%c不符合语法.请重新输入:,*(p-1),*p); gets(expri.expstr); p=expri.expstr; n=0; continue; if(change_opnd(*p)0)/+、-、*、/、=、)前一个字符只能是

20、数字和) if(change_opnd(*(p-1)!=-1) if(change_opnd(*(p-1)!=2) printf(n表达式%c或%c不符合语法.请重新输入:,*(p-1),*p); gets(expri.expstr); p=expri.expstr; n=0; continue; if(change_opnd(*p)=1)/判断表达式中是否有=重复出现,最后括号是否配对 if(*(p+1)!=0) printf(n表达式中=,只能出现在表达式结束处.请重新输入:); gets(expri.expstr); p=expri.expstr; n=0; continue; if(n

21、!=0) printf(n表达式括号不配.请重新输入:); gets(expri.expstr); p=expri.expstr; n=0; continue; p=p+1; return 1;double caculate(opnd *op,num *nu)/简单计算+,-,*,/ double b=pop_num(nu),a=pop_num(nu); switch(pop_opnd(op) case +:return(a+b);break; case -:return(a-b);break; case *:return(a*b);break; case /:return(a/b);brea

22、k; void result(opnd *op,num *nu)/计算结果 char str2MAXSIZE=,str32=0; char *ps=expri.expstr; initstack(op);/初始化栈 initstack(nu); push_opnd(op,=); while(!(*ps=)&(get_opnd(op)=)/检查是表达式和操作码是否到尾 if(change_opnd(*ps)=-1)/操作数处理 while(change_opnd(*ps)=-1) strncpy(str3,ps,1);/数字字符一个个取出放在str2 strcat(str2,str3); ps+

23、; push_num(nu,change_num(str2); strcpy(str2,); else /操作码处理 switch(procede(get_opnd(op),*ps) case :push_num(nu,caculate(op,nu);continue;break; if(*ps=)&get_opnd(op)=) ps+; continue; if(*ps=|get_opnd(op)=) continue;/表达式和操作码有一个到尾,则跳出继续循环 ps+; expri.result=get_num(nu); printf(nt 表达式:%st计算结果:%lfn,expri.expstr,expri.result); printf(t-n); i+;/表达式个数加1;void check()/显示计算结果 for(int n=0;ni;n+) printf(n); printf(t%d -n,n+1); printf(t 表达式:%s,exprn.expstr); printf(t计算结果:%.2lfn,exprn.result); if(exprn.expstr0=#)break

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

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