波兰式
表达“三加四”时,前缀记法写作“+ 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
参考<a href="http://zh.wikipedia.org/wiki/逆波兰表示法">维基百科</a>,和<a href="http://baike.baidu.com/view/552648.htm">百度百科</a>. -