- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用两种方式实现表达式自动计算
- PAGE 16 -
一、设计思想
计算表达式有两种方法:
第一种方法:直接计算表达式:
具体实现思想如下:
通过get()函数,输入所要计算的表达式。调用calculate(char ch[])函数,然后先建立两个栈,一个数值栈,一个操作符栈,同时将两个栈初始化为空,利用while循环获取表达式字符,并对表达式字符进行判断,如果是空格则直接跳过,如果是0到9的数字或者小数点‘.’,则利用trans()函数把数字转化为浮点型的数,然后在将浮点型的数值压栈,如果是操作符,则先判断操作符栈是否为空,如果为空,则操作符直接入栈,如果不为空,则先判断是不是右括号,如果是,则将栈顶元素出栈,并将数值栈中的两个元素出栈,进行相应的运算,然后把结果入栈,直到遇到左括号为止,并且把左括号出栈,如果不为左括号,则比较所扫描元素与栈顶元素的优先级,如果所扫描元素的优先级高于栈顶元素的优先级,则把所扫描元素直接入栈,如果所扫描元素的优先级低于栈顶元素的优先级,则先判断栈顶是不是左括号,如果是左括号则直接入栈,如果不是左括号,则将栈顶元素出栈,并将数值栈中的两元素出栈,进行相应的运算,然后把结果放入数值栈中,知道所扫描元素的优先级高于栈顶元素的优先级为止,如果扫到了表达式的结尾,即扫到了‘\0’,则判断此时操作符栈是否为空,如果不为空,则把操作符栈中的操作符出栈,并将数值栈中的两个数值出栈进行相应的运算,然后压入数值栈,知道操作符栈为空为止。最后将最后结果从数值栈中出栈,并返回此结果。此时表达式就计算出了最后结果。
第二种方法:先把中缀表达式转化为后缀表达式,然后在对后缀表达式进行计算。
具体实现思想如下:
中缀表达式转为后缀表达式:在主函数中通过gets()函数获得要进行计算的表达式,然后调用中缀转换函数transform(char exp[],char tem[]),然后先定义一个操作符栈,并初始化为空,利用while循环获得表达式字符,并进行判断,如果是空格则直接跳过,如果不是空格,则判断是不是0到9的数字或者小数点‘.’,如果是则把此数字字符赋给字符数组tem[],如果是操作符,则先判断操作符栈是不是为空,如果为空,则操作符直接压入栈中,如果不是为空,则判断是不是右括号,如果是右括号,则将栈顶元素出栈,赋给字符数组,tem[],知道遇到左括号为止,如果不是左括号,则比较所扫描元素与栈顶元素的优先级,如果所扫描元素的优先级高于栈顶元素的优先级,则直接入栈,如果所扫描元素的优先级小于栈顶元素的优先级,则判断栈顶元素是不是左括号,如果是左括号,则所扫描元素直接入栈,如果不是左括号则将栈顶元素出栈并赋给字符数组tem[],知道遇到所扫描元素的优先级高于栈顶元素的情况为止。如果扫到字符串结束标志,即‘\0’
后缀表达式计算:调用后缀表达式计算函数calculate(char ch[]),建立一个数值栈,并初始化为空,然后利用while循环获得表达式字符,并进行判断,如果是数字字符,则将数字字符利用trans()函数转化为浮点型的数字,并将转化后的数字压入数值栈,如果是操作符,则从数值栈将两个数值出栈并进行相应的运算,然后将计算结果压入数值栈,当扫到后缀表达式结尾的时候,将数值栈中的最后结果出栈并返回,此时表达式就计算出了最后结果。
二、算法流程图
第一种算法: 直接计算表达式,其流程图为:
否
否
如果是+-*/%
是
直接入栈
是操作符
\0
操作符栈清栈,数值栈出两数值并做相应运算,并返回最后结果
判断哪类操作符
主函数中用gets()函数输入表达式
调用算式
计算函数
判断所得字符
是数字
转换为浮点数
并加分隔符,并压栈
操作符出栈,数值栈两数出栈进行相应运算,直到遇到‘)’
是否‘(’
优先级比较
直接入栈
栈顶低
栈顶高
栈顶元素出栈,数值栈两元素出栈,然后把结果压入数值栈,再比较优先级
)
图1 直接计算算法流程图
第二种算法:先中缀表达式转化为后缀表达式,然后在计算后缀表达式,其流程图为:
如果是+-*/%栈顶元素出栈,再判断与栈顶优先级否是直接入栈\0
如果是+-*/%
栈顶元素出栈,再判断与栈顶优先级
否
是
直接入栈
\0
转换结束
是‘(’
判断哪类操作符
操作符出栈,直到遇到‘)’
是否‘(’
优先级比较
直接入栈
栈顶低
栈顶高
是操作符
主函数中用gets()函数输入表达式
调用后缀
转换函数
判断所得字符
直接放入字符数组中并加分隔符
是数字
数字得到后缀表达式判断所取字符操作符转为浮点数并
数字
得到后缀
表达式
判断所取字符
操作符
转为浮点数并
压入数值栈
\0
从数值栈中取两数,并进行相应运算,把结果压栈
最后结果出栈并返回
三、源代码
下面给出的是用直接计算算法实现的程序的源代
您可能关注的文档
- 毕业设计(论文)-浅谈建筑施工项目质量控制.doc
- 毕业设计(论文)-浅析Vandermonde行列式的相关性质及其应用.doc
- 毕业设计(论文)-上旁承体工艺编制及铣削568尺寸的铣削夹具设计.doc
- 毕业设计(论文)-设计年产800万吨炼钢生铁的炼铁车间设计.doc
- 毕业设计(论文)-数控车床加工工艺设计.doc
- 毕业设计(论文)-双筒液压减振器设计与分析.doc
- 毕业设计(论文)-网络棋牌游戏大厅的设计与实现.doc
- 毕业设计(论文)-网络应用实验平台建设研究.doc
- 毕业设计(论文)-箱体加工工艺规程及精镗Φ72孔专用夹具设计.doc
- 毕业设计(论文)-小区FTTX+LAN宽带接入网设计.doc
- 浙江金华市公共资源交易中心永康市分中心编外人员招考聘用笔试历年典型考题及考点研判与答案详解.docx
- 浙江宁波慈溪市政协办公室招考聘用编外工作人员笔试历年典型考题及考点研判与答案详解.docx
- 浙江金华永康市西溪镇人民政府招考聘用笔试历年典型考题及考点研判与答案详解.docx
- 福建南平市公安局建阳分局招考聘用辅警笔试历年典型考题及考点研判与答案详解.docx
- 浙江嘉兴海盐县武原街道基层残疾人工作专职委员(公益岗位)招考聘用笔试历年典型考题及考点研判与答案详解.docx
- 浙江宁波知识产权保护中心招考聘用工作人员笔试历年典型考题及考点研判与答案详解.docx
- 浙江杭州建德市面向2024届普通高校毕业生招考聘用教师(第二批)16人笔试历年典型考题及考点研判与答案详解.docx
- 浙江省台州中学面向2024届普通高校毕业生招考聘用教师12人笔试历年典型考题及考点研判与答案详解.docx
- 湖北师范大学体育学院专任教师招考聘用笔试历年典型考题及考点研判与答案详解.docx
- 重庆市南岸区教育事业单位面向2024届高校毕业生招考聘用114人笔试历年典型考题及考点研判与答案详解.docx
文档评论(0)