数据结构前缀表达式后缀表达式报告正文.doc

数据结构前缀表达式后缀表达式报告正文.doc

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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 从数值栈中取两数,并进行相应运算,把结果压栈 最后结果出栈并返回 三、源代码 下面给出的是用直接计算算法实现的程序的源代

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档