算术表达式的求值法
如(6*2+5*9)/2的这类表达式称为中序表示法,这是一般人所习惯的的写法。不过由于中序法优先权和结合性的问题,在计算机编译程序的处理上很不方便,所以在计算机的上的解决之道是将其换成后序法(较常用)和前序法,这种表达式的种类,依据运算符在表达式中的位置,可以将其分为中序法、前序法、后续法。
- 中序法:<操作数1><运算符><操作数2>
- 前序法:<运算符><操作数1><操作数2>
- 后序法:<操作数1><操作数2><运算符>
以下介绍几种解析算术表达式的方法以及求值方法:
一、括号法
1、中序转前序
(1)将中序表达式根据顺序用括号完整的括起来
(2)移动所有的运算符来取代所有的左括号,并以最近者为原则
(3)将所有的右括号去掉
2、中序转后序
(1)将中序表达式根据顺序用括号完整的括起来
(2)移动所有的运算符来取代所有的右括号,并以最近者为原则
(3)将所有的左括号去掉
3、分析
例如2*3+4*5,中序转前序:
第一步:((2*3)+(4*5))
第二步:+*23)*45))
第三步:+*23*45
中序转后序:
第一步:((2*3)+(4*5))
第二步:((23*(45*+
第三步:23*45*+
二、堆栈法
这里只介绍中序转后序,中序转前序类似,篇幅限制不再介绍。
1、中序转后序步表达式的步骤
(1)从左向右依次取得数据ch。
(2)如果ch是操作数,直接输出。
(3)如果ch是运算符(含左右括号),则:
a:如果ch = '(',放入堆栈。
b:如果ch = ')',依次输出堆栈中的运算符,直到遇到'('为止。
c:如果ch不是')'或者'(',那么就和堆栈顶点位置的运算符top做优先级比较。
1:如果ch优先级比top高,那么将ch放入堆栈。
2:如果ch优先级低于或者等于top,那么输出top,然后将ch放入堆栈。
(4)如果表达式已经读取完成,而堆栈中还有运算符时,依次由顶端输出。
2、分析
以A-B*(C+D)/E为例进行分析: