- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用两种方式实现表达式自动计算
- PAGE 18 -
一、设计思想
计算算数表达式并求值,采取的共有两种方法:
先将算数表达式转化为后缀表达式,然后对后缀表达式进行计算。
对算数表达式进行直接的计算。
第一种算法
这种解决方案又分为两步:
1.将表达式先转化为后缀表达式的字符串数组
2.利用后缀表达式进行计算
在转化过程中,第一,建立一个存符号的栈,和一个字符串数组,用来存放转化以后的表达式
然后,对于得到的用户输入的字符串进行逐个的扫描,如果是数组或者小数点,则直接存放到数组中,并且在后面加入一个分隔符,如果是操作符,则和栈中的已存的进行比较,如果比栈中的操作符的优先级高,则直接入栈,如果优先级低或相等,则栈中元素出栈,存到字符串中,然后再次检查栈顶,直到栈中元素的优先级低于扫描操作符,则此操作符入栈,然后扫描下一个字符,直到遇到字符串的结束符号\0,扫描结束。数组中存的就是后缀表达 式。得到后缀表达式后,进行计算,要用到数值栈。首先要将字符表示的数字转化为浮点小数,然后进行扫描,遇到数值,放入栈中,遇到操作符,就从栈中取出两个数,进行计算后再放入栈中,扫描下一个,最后的计算结果就存到了栈中,直接取出栈内元素,就是计算的最后结果。
第二种算发
首先要建立两个栈,一个用来存放操作符,一个用来存放数值。开始对用户输入的字符串进行扫描,如果是数字字符或者小数点,则将字符转化为浮点数存到数栈里,如果是操作符,则观察符号栈,如果栈顶元素的优先级低于观察的操作符,则操作符入栈,如果栈顶元素的优先级高于或者等于观察的操作符,则从数值栈中取出两个浮点数,从符号栈中取出栈顶的操作符,然后进行相应的数值计算,所得的结果再存到数值栈中,重复这样的操作,直到符号栈中栈顶元素的优先级低于观察的操作符,则此操作符入栈,然后对下一个字符进行扫描。如果是左括号,则不进行优先级的比较,直接入栈,入栈后优先级为-1。如果是右括号,则从数值栈中取两个操作数,符号栈中取出一个符号,然后进行计算后得数放入数栈中,不断 进行此类操作,直到从栈中取出的是左括号为止,左括号去掉,扫描下一个。扫描结束后,计算也结束了,计算的结果就存放在数值栈中,最后把数值栈中的数取出,就是所得的计算结果。
容错的算法简要:
括号匹配:当扫描到左括号是,左括号直接入栈,扫描到右括号时,则左括号出栈,如果栈为空,则右括号多,如果最后栈中还有括号,则左括号多。给出错误提示。
除数不为0:当扫描到/时,就判断其后面的数字是否为0,如果为0报错。
取余运算:取余运算时,操作数判断是否为整数,不为整数报错。
二、算法流程图
第一种算法:先将表达式转化为后缀表达式,然后计算
其主函数流程图为:
得到用户输入
得到用户输入
的中缀表达式
调用容错函数
存在错误
报错并结束
无错
调用函数得到
后缀表达式
后缀表达
式的计算
返回计算结果
调用直接计
算的函数
返回直接计算的结果
返回直接计算的结果
图1 主函数算法流程图
其中将中缀表达式转化为后缀表达式的主要流程为:
取得字符
取得字符
并判断
如果是数字
或小数点
直接放入字符数组中
在其后加入分隔符
如果是操作符
与栈顶比较
判断哪类括号
直接入栈
右括号
取出不为(
从栈中取
出操作符
放入数组
直接入栈
优先级高于栈顶
如果是括号
出栈存入数组中
左括号优先级不高于栈顶
左括号
优先级不高于栈顶
图2 中缀转化为后缀算法流程图
后缀表达式的计算,实现的流程图为:
从数栈取2个数做相应计算结果存入数栈
从数栈取2个数做相应计算结果存入数栈
判断符号类型
得到后缀表达式
数字字符
操作符
转化为浮点数入栈
从数栈中取出计算结果作为返回值
图3 后缀表达式计算算法流程图
下面介绍直接计算出结果的算法的实现:
栈非空
栈非空
栈空
低于栈顶
高于栈顶
NO
YES
左括号
得到中缀表达式
从字符串中取出一个字符
判断字符类型
数字字符
操作符
转化为浮点数入栈
括号
括号类型
直接入栈
右括号
从栈中取出操作符
是否为(
丢弃(
放入
数组
与栈顶比较
直接入栈
取出栈顶两个
数作相应计算
结果存入数栈
符号栈是
否为空
将数值栈
顶返回
取栈顶符号与2个数计算,结果存入数值栈
图4 直接计算中缀表达式算法流程图
三、源代码
下面给出的是用先转后缀再计算和直接计算的算法实现的程序的源代码:
#includestdio.h /*导入需要用到的各种包*/
#includestdlib.h
#includestring.h
typedef struct /*定义结构体用来存储操作符*/
{
char op;
文档评论(0)