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

来源:互联网 发布:python快速注释快捷键 编辑:程序博客网 时间:2024/04/29 08:14

波兰式

表达“三加四”时,前缀记法写作“+ 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入栈51入栈5, 12入栈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

参考<a href="http://zh.wikipedia.org/wiki/逆波兰表示法">维基百科</a>,和<a href="http://baike.baidu.com/view/552648.htm">百度百科</a>.


0 0
原创粉丝点击