前缀式(波兰式)与后缀式(逆波兰式)求解表达式的值,中缀式(一般算数表达式不做讨论)

波兰式

表达“三加四”时,前缀记法写作“+ 3 4”,而不是“3 + 4”。在复杂的表达式中,操作符仍然在操作数的前面,但操作数可能是包含操作符的平凡表达式。例如,如下的中缀表达式:

(5 − 6) * 7

写作前缀表示法时是:

*(− 5 6) 7

或省略括号:

* − 5 6 7

由于简单的算术运算符都是二元的,该前缀表达式无需括号,且表述是无歧义的。在前面的例子里,中缀形式的括号是必需的,如果将括号移动到:

5 − (6 * 7)

即:

5 − 6 * 7

则会改变整个表达式的值。而其正确的前缀形式是:

− 5 * 6 7
算法求解为:
1、遍历波兰式,当遇到操作符时不做处理:继续遍历遇到连续两个操作数时,取前面的操作符求值,构建新的波兰式。接着遍历完整个波兰式。
2、再接着遍历波兰式直到波兰式只有一个操作数为止,该操作数就是我们要求的波兰式的值。
过程如下:
* − 5 6 7
*(-1)7
-7


− 5 * 6 7
- 5  42
37

逆波兰式(后缀式)

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在 数据结构和编译原理这两门课程中都有介绍,下面是一些例子:
正常的表达式 逆波兰表达式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
http=(smtp+http+telnet)/1024 写成什么呢?
http=smtp,http,+,telnet,+,1024,/
规律:操作数在前,操作符在后,并且要看优先规律;
算法:由逆波兰式求表达式的值:

中缀表达式“5 + ((1 + 2) * 4) − 3”写作

5 1 2 + 4 * + 3 −

下表给出了该逆波兰表达式从左至右求值的过程,堆栈栏给出了中间值,用于跟踪算法。(一个栈来模拟,1,栈遇到操作数就入栈,2、遇到操作符就弹出两个操作数进行运算,3、运算结果再压入栈顶。直到遍历完整个逆波兰式(后缀式))。

输入 操作 堆栈 注释
5 入栈 5
1 入栈 5, 1
2 入栈 5, 1, 2
+ 加法运算 5, 3 (1, 2)出栈;将结果(3)入栈
4 入栈 5, 3, 4
* 乘法运算 5, 12 (3, 4)出栈;将结果(12)入栈
+ 加法运算 17 (5, 12)出栈;将结果 (17)入栈
3 入栈 17, 3
减法运算 14 (17, 3)出栈;将结果(14)入栈

计算完成时,栈内只有一个操作数,这就是表达式的结果:14

参考维基百科,和百度百科.


你可能感兴趣的:(算法)