




免费预览已结束,剩余6页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 实验目的和要求(1)深入理解栈的特点及其描述方法。 (2)能够在两种存储结构上实现栈抽象数据类型实现。 (3)掌握栈的几个典型应用算法,能灵活应用栈解决实际问题。2、 概要设计【定义所有抽象数据类型、自定义函数间的调用关系图,自定义函数的功能描述和流程图,以及主程序的流程图。】Y开始输出结果EvaluateExpression ( )While(1)定义运算符和操作数栈并初始化 并fflush(stdin)清除缓存OPTR; OPND; 输入每个字符并执行相应的条件语句入栈出栈/比较OPTR的栈顶元素和ch的优先级char Precede (SElemType_OPTR top, char ch)/运算并将结果出栈Operate 3、 调试分析【(1) 调试过程中遇到的问题是如何解决的以及对设计与实现中关键点的回顾讨论和分析;(2) 算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;(3) 经验和体会等。】1.栈的定义、初始化、出栈进栈、取栈顶元素等步骤不难就先把结构打好了2.操作数和运算符分别入不同的栈char-int 进 操作数栈 先考虑了小于10的整数直接进栈,重点是运算符的优先级这块函数的编写3前面的都听简单的,就是小数编写这块想了很久,将单个字符转为整数后还要定一个double p;使依次输入的数成一个小数-p.在小数入栈使要考虑放在那条if语句中,防止在运算结果入栈后p再次入栈,又定义了int flag;通过flag的值判定p是否入栈。并且成功入栈后p,q都要回到初始状态。小数解决4.负数部分讨论一开始就有负数和运算符后面有负数的情况。(比较容易) 右图重点 。定义了low做判定符号的标志。如果在运算符后输入负号则low=-1(将p入栈时入栈的是p*low),继续输入ch。总结:我觉得写的好的地方在于定义了flag,low分别作为小数入栈和负号与减号区别的条件。第一次写这么长的代码,还有就是将输入的字符再转到小数这段代码可以留着很有用。开始考虑的大整数想麻烦了,直接用double 难度降低了很多4、 测试数据与结果【列出你的测试结果,包括输入和输出。测试数据应该完整和严格,最好多于需求分析中所列。】序号输入输出说明11-2#3.000减负数2-1-2#-3.000两负数3-1-2#1.00043.66+4.34#8.000小数52*2+4-32#-1.000长串+乘方63.66*2+3-4#6.32071+3-4*5/2+3.666#-2.3395、 附录【给出每部分的源代码(必须要有一定量的注释)。】/* common.h */#include stdio.h#include string.h#include ctype.h#include math.h/*其他函数的声明*/double EvaluateExpression ( ); /算数表达式求值的算法优先算法char Precede (SElemType_OPTR top, char ch); /比较OPTR的栈顶元素和ch的优先级double Operate (SElemType_OPND a, SElemType_OPTR theta, SElemType_OPND b); /运算/栈基本操作的函数声明void OPTR_InitStack(Sqstack_OPTR &s); /运算符栈初始化void OPND_InitStack(Sqstack_OPND &s); /操作数栈初始化char OPTR_GetTop(Sqstack_OPTR s); /取运算符的栈顶元素double OPND_GetTop(Sqstack_OPND s); /取操作数的栈顶元素 void OPTR_Push(Sqstack_OPTR &s,SElemType_OPTR e); /入栈void OPND_Push(Sqstack_OPND &s,SElemType_OPND e); /入栈void OPTR_Pop(Sqstack_OPTR &s,SElemType_OPTR &e); /出栈void OPND_Pop(Sqstack_OPND &s,SElemType_OPND &e); /出栈/*基本操作函数的实现*/#include common.h#include Sqstack.h#include other.h/运算符栈初始化void OPTR_InitStack(Sqstack_OPTR &s) s.base=new SElemType_OPTRMAXSIZE;if(!s.base)printf(n运算符栈存储分配失败!n);s.top=s.base;s.stacksize=MAXSIZE;/操作数栈初始化void OPND_InitStack(Sqstack_OPND &s) s.base=new SElemType_OPNDMAXSIZE;if(!s.base)printf(n操作数栈存储分配失败!n);s.top=s.base;s.stacksize=MAXSIZE;/取操作符的栈顶元素char OPTR_GetTop(Sqstack_OPTR s)if(s.top!=s.base)return *(s.top-1);return 0;/取运算数的栈顶元素double OPND_GetTop(Sqstack_OPND s)if( s.top != s.base )return ( *(s.top-1) )-0;return 0;/运算符入栈void OPTR_Push(Sqstack_OPTR &s,SElemType_OPTR e)if(s.top-s.base = s.stacksize)printf(n满栈!n);*s.top+=e; /先赋值后自加/操作数入栈void OPND_Push(Sqstack_OPND &s,SElemType_OPND e)if(s.top-s.base = s.stacksize)printf(n满栈!n);*s.top+=e+0; /先赋值后自加/运算符出栈void OPTR_Pop(Sqstack_OPTR &s,SElemType_OPTR &e)if(s.top = s.base)printf(n空栈!n);e=*-s.top;/操作数出栈void OPND_Pop(Sqstack_OPND &s,SElemType_OPND &e)if(s.top = s.base)printf(n空栈!n);e=(*-s.top)-0;/*其他函数的实现*/#include common.h#include Sqstack.h#include other.h/算数表达式求值的算法优先算法double EvaluateExpression ( )Sqstack_OPTR OPTR;Sqstack_OPND OPND;char ch; char x; /弹出的(char dimo=0; /记录小数点分前后计算double p=0; /将输入的操作数处理后得double p;然后p入栈double q=0.1; /小数点后运算int low=1; /判断负数int flag=1; /用来判定 double p 是否入栈SElemType_OPTR theta; /运算符栈顶元素SElemType_OPND a,b; /弹出的两个要运算的操作数/初始化 OPTR_InitStack(OPTR); /OPTR运算符 OPND_InitStack(OPND); /OPND操作数OPTR_Push(OPTR,#); /将表达式起始符压入运算符栈scanf(%c,&ch);if( ch = -)low=-1;scanf(%c,&ch); /保证接下来的实现从数字开始while(ch != # | OPTR_GetTop(OPTR) != # )if( isdigit(ch) | ch = .)flag=1;if(ch != . )if ( dimo != . )p = p*10 ;p += (ch-0);scanf(%c,&ch);else if ( dimo = .)p = p+(ch-0)*q;q=q*q;scanf(%c,&ch);else if( ch = . )dimo = .;scanf(%c,&ch); elseif( flag = 1 )OPND_Push(OPND,p*low); /操作数进栈OPNDdimo=0;p=0;q=0.1;switch( Precede( OPTR_GetTop(OPTR), ch ) )case :OPTR_Pop(OPTR,theta); /运算符存到theta出栈OPND_Pop(OPND,b); /操作数出栈OPND_Pop(OPND,a); /操作数出栈OPND_Push( OPND,Operate(a,theta,b) );flag =0 ;break; /注意此处没有输入!case =:OPTR_Pop(OPTR,x); /相等的情况: 栈顶元素是(,且ch是) 即消除一对括号scanf(%c,&ch);/low=1;break;return OPND_GetTop( OPND ); /比较OPTR的栈顶元素和ch的优先级char Precede (SElemType_OPTR top, char ch)switch (top)case +:if(ch=+|ch=-|ch=)|ch=#)return ;if(ch=*|ch=/|ch=(|ch=)return ;if(ch=*|ch=/|ch=(|ch=)return ;if(ch=(|ch=)return ;if(ch=(|ch=)return ;break;case (:if(ch=+|ch=-|ch=*|ch=/|ch=()return ;if(ch=)return =;if(ch=)return ;break;case #:if(ch=+|ch=-|ch=*|ch=/|ch=(|ch=)return ;if(ch=()return =;break;return 0;/运算double Operate (SElemType_OPND a, SElemType_OPTR theta, SElemType_OPND b)switch(theta)case +:return a+b;break;case -:return a-b;break;case *:return a*b;break;case /:return a/b;break;case :return pow(a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 解析卷云南省宣威市中考数学真题分类(平行线的证明)汇编专题测试试题(含解析)
- 2025年广播媒体融合发展报告:新媒体环境下转型挑战与机遇
- 物业管理合同法律法规解读
- 推拿治疗学考试题库附参考答案详解【培优b卷】
- 2025版潲水回收与废弃物资源化利用项目承包合同
- 2025年度发展和改革委员会高新技术产业发展合作合同
- 2025版商品房买卖合同智能家居系统安全评估及风险防控合同
- 2025年度智能交通管理系统开发合同
- 2025年度生态旅游区土石方运输及绿化工程合同
- 2025版金融行业招投标保密协议书
- 2025广东广州市从化区社区专职人员招聘33人笔试参考题库附答案解析
- 建材买卖(橱柜订购类)合同协议书范本
- 新概念第一册课文讲解
- 【里斯】年轻一代新能源汽车消费洞察与预测 -新物种 新理念 新趋势(2024-2025)
- 2025年小学英语教师业务理论考试试题及答案
- 中小学基孔肯雅热应急防控预案
- CMF中国宏观经济专题报告第107期稳定币 货币金融体系演进的新支点
- 港口无人驾驶行业深度报告:奇点已至蓝海启航
- T-CFIE 002-2024 可持续供应链风险识别与管理
- 2025年高校教师岗前培训高等教育心理学知识竞赛考试题库70题及答案
- 纪法考试题库及答案解析
评论
0/150
提交评论