用两种方式实现表达式计算.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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 /* 定义运算符号栈

文档评论(0)

haowendangqw + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档