- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用两种方式实现表达式计算
一、设计思想
本项目用两种方式实现表达式自动计算:一是,用扫两遍表达式的方法;二是,用扫一遍表达式的方法。其算法如下:
算法一:
扫两遍表达式求值的基本思路是:先将中缀表达式转化为后缀表达式,再通过计算后缀表达式求表达式的值。
第一遍扫描中缀表达式,将其转换为后缀表达式,在这步中用到一个运算符栈和一个列表(用数组实现)。当扫到一个数时,因为运算数的位数不一定而且还有小数点,所以需要判断运算数的位数,将这个运算数按原来的顺序挂到列表中;当扫到一个运算符时,如果栈空:运算符直接入栈。栈不空时:遇到左括号,直接入栈;遇到右括号,则开始出栈挂到列表后,直到栈顶为左括号,左括号出栈;遇到加、减、乘、除、求余运算符号时,当栈顶的运算符优先级低于扫到的运算符,运算符入栈,否则运算符出栈挂到列表后,直到满足入栈条件;当扫描完整个中缀表达式,将栈里面的运算符全都出栈挂列表后。另外,因为后缀表达式中两个运算数会连在一起,所以为了区分两个运算数,每当扫描到加、减、乘、除、求余运算符号和栈中运算符出栈挂表后,在列表中添加一个空格作为分隔符。这样列表中的表达式就是对应的后缀表达式。
第二遍扫描后缀表达式,并计算,这步中用到一个栈来放扫描到的数。当扫到一个数时,因为运算数的位数不一定而且还有小数点,所以在扫到一个数时要判断这个数的位数,将这个完整的运算数字符串整个取出,把这个字符串转化为数值型(如;利用 atof() 函数将字符串转换为浮点型等),将其入栈;当扫到一个运算符时,则出栈两个数,先出栈的数作为第一个运算数后出栈的作为第二个运算数,按照所扫描到的运算符进行计算,并将计算结果放到栈中。当扫描完整个后缀表达式后,在栈中只有一个数,这个数就是我们所要求值的表达式的结果。
算法二:
扫一遍表达式求值的基本思路是:用两个栈(一个字符栈、一个数字栈)边扫描边计算,最后在数字栈中所得的数就是计算结果。
扫描要求值的表达式,当扫描到一个数时,因为运算数的位数不一定而且还有小数点,所以在扫到一个数时要判断这个数的位数,将这个完整的运算数字符串整个取出,把这个字符串转化为数值型(如;利用 atof() 函数将字符串转换为浮点型等),将其入数字栈。
当扫描到一个运算符时,如果运算符栈空:运算符直接入运算符栈。运算符栈不空时:遇到左括号,直接入运算符栈;遇到右括号则从数字栈中出栈两个数,先出栈的数作为第一个运算数后出栈的作为第二个运算数,从运算符栈中出栈一个运算符,将两个数按照出栈运算符进行计算,并将计算结果放到数字栈中,直到运算符栈栈顶为左括号,左括号出栈;遇到加、减、乘、除、求余运算符号时,当运算符栈栈顶的运算符优先级低于扫到的运算符,运算符入运算符栈,否则从数字栈中出栈两个数,先出栈的数作为第一个运算数后出栈的作为第二个运算数,从运算符栈中出栈一个运算符,将两个数按照出栈运算符进行计算,并将计算结果放到数字栈中,直到满足入栈条件。
当扫描完整个表达式,如果运算符栈中不空,则从数字栈中出栈两个数,先出栈的数作为第一个运算数后出栈的作为第二个运算数,从运算符栈中出栈一个运算符,将两个数按照出栈运算符进行计算,并将计算结果放到数字栈中,直到运算符栈为空。这样,最后在数字栈中只有一个数了,这个数就是我们所要求值的表达式的结果。
二、算法流程图
图1 扫两遍算法流程图
图2 扫一遍算法流程图
图1 : 扫两遍的算法流程图,在扫描中以index为索引作为数组的下标,扫完一个字符,完成相应操作,index自加;在扫完每个运算数后加个空格作为分隔符;在将数字转化为浮点数时,取到整个数的字符串,用atof()函数将其转换为浮点数。在每次扫描各用到一个栈,在程序的过程中,我们能得到后缀表达式。
图2 :扫一遍的算法流程图,在扫描中以index为索引作为数组的下标,扫完一个字符,完成相应操作,index自加;在将数字转化为浮点数时,取到整个数的字符串,用atof()函数将其转换为浮点数。在扫描计算的过程中用到两个栈。
三、源代码
下面给出的是用扫两遍算法实现的程序的源代码:在本算法中在每次扫描表达式时各用到一个栈,在第一边扫描过程中先把中缀表达式转换为后缀表达式,通过计算后缀表达式,间接的求得表达式的值。代码如下:
#includestdio.h
#includestdlib.h
typedef struct /* 定义数栈 */
{
double arrary_num[100];
int top_num;
}STACK_NUM;
typedef struct /* 定以结构体类型 */
{
char mysign;
int level;
}MYSIGN;
typedef struct /* 定义运算符号栈
您可能关注的文档
最近下载
- 【絮语文】2026高一语文必修上册《江城子乙卯正月二十日夜记梦》课件.pptx
- 我的阿勒泰读书分享.pptx VIP
- 2023(新版)研学旅行指导师考试参考题库(含答案).pdf VIP
- 一种桥面沥青面层摊铺导线控制装置.pdf VIP
- 公路工程监理机构设置与岗位职责.docx VIP
- 2025中航材华顺航空资源服务(北京)有限公司招聘27人笔试参考题库附答案解析.docx VIP
- 活动机会视角下老年人地面公交出行空间公平性:理论、实证与优化策略.docx
- 村社区两委换届选举工作培训ppt课件.pptx VIP
- 2025年水利系统职称考试题库与答案.docx
- 《2024年 互换·共情·交流_共同体美学和创作者本位》范文.docx VIP
文档评论(0)