- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用两种方式实现表达式自动计算
- PAGE 20 -
一、设计思想
一.直接计算结果的设计思想:
此种算法最主要是用了两个栈:操作符栈和操作数栈,以及一个数组,用来存放用户输入的表达式。从数组中获取元素,如果是操作数,则直接进操作数栈,但如果获取的是操作符,则要分情况讨论,如下:(这里讨论优先级时暂不包括“(”和“)”的优先级)
1.如果获取的操作符a的优先级高于操作符栈栈顶元素b的优先级,则a直接入操作符栈;
2.如果获取的操作符a的优先级低于操作符栈栈顶元素b的优先级,则b出栈,a进栈,并且取出操作数栈的栈顶元素m,再取出操作数栈新的栈顶元素n,如果b为+,则用n+m,若为减号,则n-m,依此类推,并将所得结果入操作数栈;
3.如果获取的是“(”,则直接进操作符栈;
4.如果获取的是“)”,则操作符栈的栈顶元素出栈,做类似于情况2的计算,之后把计算结果入操作数栈,再取操作符栈顶元素,如果不是“(”,则出栈,重复操作,直到操作符栈顶元素为“(”,然后“(”出栈;
5.当表达式中的所有元素都入栈后,看操作符栈中是否还有元素,如果有,则做类似于情况2 的计算,并将结果存入操作数栈,则操作数栈中最终的栈顶元素就是所要求的结果。
二.中缀转后缀及对后缀表达式计算的设计思想:
中缀转后缀时主要用了一个操作符栈和两个数组(用数组一用来存用户输入的表达式,用数组二来存后缀表达式),从数组一中依次获取元素,如果获取的是操作数,则直接存入数组二中,如果获取的是操作符也需分情况讨论,如下:(这里讨论优先级时暂不包括“(”和“)”的优先级)
1. 如果获取的操作符a的优先级高于操作符栈栈顶元素b的优先级,则a直接入操作符栈;
2. 如果获取的操作符a的优先级低于操作符栈栈顶元素b的优先级,则b出栈,a进栈,并且将b存入到数组二中;
3.如果获取的是“(”,则直接进操作符栈;
4.如果获取的是“)”,则操作符栈的栈顶元素出栈,并依次存入到数组二中,直到操作符栈栈顶元素为“(”,然后将“(”出栈;
5.当表达式中的所有元素都入栈或存入到数组二之后,看操作符栈中是否还有元素,如果有,则依次出栈,并且依次存入到数组二中,最后打印数组二中的字符串,则此字符串即为要求的后缀表达式。
对后缀表达式的计算方法:主要用到了一个操作数栈,从数组二中依次取出元素,如果是操作数,则进栈,如果是操作符,则从操作数栈中依次取出两个栈顶元素a1和a2,如果操作符是“/”,则计算a2/a1,将计算结果再次进栈,依此类推,最终栈顶元素即为计算的最终结果。
在这两种算法中,应该特别注意一点:人的习惯,用户在输入表达式时,容易这样输入,如:3*4(3+2),这样是不可取的,应必须要用户输入3*4*(3+2),这是在设计思想上错误提示的很重要一点,否则计算不全面!
二、算法流程图
第一个图是直接计算的流程图,图中反应除了这种方法的大致设计思路,但是有些细节没有反映出来,比如说,怎样把字符型数据转换为浮点型数据,就没有反映出来。特别说明的是棱形左边代表Y,右边代表N,具体流程图如下:
开始
开始
用户输入表达式
将表达式存入到数组expr[]
构造两个栈
从expr中获取元素c
c是否为数
数入操作数栈
是否为+-*/或%
优先级是否高于操作符栈栈顶元素优先级
进符号栈
操作符栈里栈顶元素出栈,并做相应的计算,将结果再入操作数栈,从数组里取的元素入操作符栈
是否为“(”
进操作符栈
操作符栈里元素出栈,,做相应操作直到栈顶元素为“(”,“(”出栈
数组内元素是否取尽
操作符栈内元素全部出栈,做相应计算,所得结果进操作数栈,即为最终结果
结束
图1 、直接计算算法流程图
第二个图是对后缀表达式的求值的算法流程图,同样,棱形左边代表Y,右边代表N,怎样把字符型数据转换为浮点型数据,也同样没有反映出来。具体图如下:
开始
开始
从后缀数组中获取元素
是否为数
存入操作数栈中
为操作符,则从操作数栈中取值作相应操作
后缀数组中是否还有元素
栈里最终栈顶元素即为最终结果
结束
图2 、后缀表达式计算的流程图
第三个图是从中缀表达式转为后缀表达式算法的流程图,同样的,棱形左边代表Y,右边代表N,在我的具体代码中,用户输入表达式时是要求以#结尾的,这些在流程图中均省略了,细节的处理,流程图中没有反映出来,主要就表现主要的思路算法。具体的流程图如下:
开始
开始
用户输入表达式
将表达式存入到数组expr[]
构造一个操作符栈和一个存放后缀表达式的数组
从expr中获取元素c
c是否为数
存入后缀数组中
是否为+-*/或%
优先级是否高于操作符栈栈顶元素优先级
进操作数栈
操作符栈里栈顶元素出栈,并存入到后缀数组中,然后从数组里取的元素入操作符栈
是否为“(”
进操作符栈
操作符栈里元素出栈,并依次存
您可能关注的文档
- 输送链维护保养指导书.doc
- 输血 第四季度反馈总结.doc
- 输血病历书写规范探讨-培训.ppt
- 输血差错的防范制度.doc
- 输血管理与持续改进 检查表.doc
- 输血全过程质量管理监控.doc
- 输液泵及注射泵的使用程序及保养.doc
- 输液车间洁净区臭氧灭菌效果再验证方案.doc
- 输液反应处理流程及应急预案.doc
- 蔬菜保鲜冷库安装设计.doc
- 场地脚手架工程施工方案(3篇).docx
- 2024年浙江省丽水市松阳县玉岩镇招聘社区工作者真题及参考答案详解一套.docx
- 2024年河南省郑州市惠济区古荥镇招聘社区工作者真题及答案详解一套.docx
- 2024年浙江省杭州市淳安县文昌镇招聘社区工作者真题及完整答案详解1套.docx
- 2024年浙江省台州市三门县小雄镇招聘社区工作者真题带答案详解.docx
- 2024年浙江省宁波市余姚市河姆渡镇招聘社区工作者真题及完整答案详解1套.docx
- 2024年浙江省丽水市景宁畲族自治县雁溪乡招聘社区工作者真题及答案详解一套.docx
- 2024年浙江省杭州市临安市板桥乡招聘社区工作者真题及答案详解一套.docx
- 2024年湖北省宜昌市点军区土城乡招聘社区工作者真题及答案详解一套.docx
- 2024年浙江省台州市路桥区桐屿街道招聘社区工作者真题附答案详解.docx
文档评论(0)