数据结构两种方式实现表达式的计算.doc

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用两种方式实现表达式自动计算 - 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是否为数 存入后缀数组中 是否为+-*/或% 优先级是否高于操作符栈栈顶元素优先级 进操作数栈 操作符栈里栈顶元素出栈,并存入到后缀数组中,然后从数组里取的元素入操作符栈 是否为“(” 进操作符栈 操作符栈里元素出栈,并依次存

文档评论(0)

zhuliyan1314 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档