- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
则运算表达式求值算法作者:韦延昭
EmaiI:yIs8420@163.com
26,April26,2008
弓I言:四则运算表达式包含操作数、操作符以及括号等。操作数可以是任意实数,操作符包括加(+)、减(-)、乘e)以及除(/)等。本文将利用C++标准模板库(STL)中的堆栈和队列来编程实现计算任意实数的四则运算表达式的值。
题:设计一个处理和计算四则表达式的类,该类有一个字符串
类型的成员变量用来表示初始的中缀表达式的字符串,例如中缀表达式:
(2.99-4.32)*(90.8-78.66)+78.0/3.14
通过该类的成员函数将该表达式的值计算出来。
要求:操作数可以是任意实数、括号对数以及表达式长度没有限
制。
由于操作数是任意的实数,所以必页将原始的中缀表达式
中的操作数、操作符以及括号分解出来,并以字符串的形式保存;然
后再将其转换为后缀表达式的顺序,为什么要转换为后缀表达式的形
式呢?原因是后缀表达式可以很容易地利用堆栈计算岀表达式的值。
例如有如下的中缀表达式:
a+b-c
转换成后缀表达式为:
ab+c-
然后分别按从左到右放入栈中,女採碰到操作符就从栈中弹出两个操作数进行运算,最后再将运算结果放入栈中,依次进行直到表达式结束。如k述的后缀表达式先将Q和b放入栈中,然后碰到操作符“+”,则从栈中弹出Q和b进行a+b的运算,并将其结果d(假设为d)放入栈中,然后再将c放入栈中,最后是操作符“一”,所以再弹出d和c进行d-c运算,并将其结果再次放入栈中,此时表达式结束,则栈中的元素值就是该表达式最后的运算结果。当然将原始的中缀表达式转换为后缀表达式比较关键,要司时考虑操作符的优先级以及对有括号的情况下的处理,相关内容会在算法具体实现中详细讨论。
换?现过程:大体上可以分为三步进行:一、将原始的中缀表达式中的操作数、操作符以及括号按顺序分解岀来,并以字符串的形式保存。
二、将分解的中缀表达式转换为后缀表达式的形式,即调整各项字符串的顺序,并将括号处理掉。
三、计算后缀表达式的值。
计类:为了体现C++Object-Oriented的特点,我们将此算
法在类中实现。首先设计一个类ExpressionType,其具体定义如下:
/****************************************************************************************
*ExpressionType.h
**火*火*火*火*火*火*火*火:Ar*******************火*火*火*火*火*火*火*火*次******************火*火*火*火*火*火*火*火*/#includestring
#includestack
#includequeue
usingnamespacestd;
classExpressionType
{
public:
ExpressionType();
ExpressionType(stringm_string);
voidoperator=(stringm_string);
doubleCalculate!);
private:
queuestringDivideExpressionToItein();
stackstringChangeToSuffix();
boolIsWellFormf);
intSize();
private:
stringm_string;
};
类ExpressionType的定义包含了三个头文件stringstack以及queue,这是标准模板库里现成的东西,直接拿来用就行了,不必再自己写栈和队列,它们都在std命名空间里。下面对类ExpressionType的成员作介绍:
um_string:私有成员变量,字符串类型。主要用于存储表示原始中缀表达式的字符串。
u这里定义了两个构造函数,不带参数的默认m_string为空,带string类型
参数的将参数值赋予成员变量m_string,此外还定义了赋值运算符目的是将一个表达式字符串赋予成员变量m_stringo因此生成一个ExpressionType的对象可以有如下两种形式:
ExpressionTypeexpr(u(2.99-4.32)*(90.8-78.66)+78.0/3.14w);或者
ExpressionTypeexpr;
Expr=a(2.99-4.32)*(90.8-78.66)+78.0/3.14,J;
uDivideExpressionToItem():私有成员函数,返回值是一个string类型的队列。其功能是将原始的中缀表达式中的操作数、操作符以及括号按顺序以字符串的形式分解出来,然后保存在一个队列中(队列的操作规则是先进先出)。
文档评论(0)