前缀式(波兰式)与后缀式(逆波兰式)求解表达式的值,中缀式(一般算数表达式不做讨论)
2014-04-25 01:22
435 查看
波兰式
表达“三加四”时,前缀记法写作“+ 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)入栈 |
参考<a href="http://zh.wikipedia.org/wiki/逆波兰表示法">维基百科</a>,和<a href="http://baike.baidu.com/view/552648.htm">百度百科</a>.
相关文章推荐
- 数据结构实验之栈二:一般算术表达式转换成前缀式,中缀式,后缀式
- nyoj-409 郁闷的C小加(三) (表达式求值,中缀式转前缀式,中缀式转后缀式)
- 一般算数表达式转换为“后缀式”
- 表达式的中缀式转换为前缀式及后缀式
- 如何将中缀式转化成前缀式和后缀式(波兰和逆波兰)(适合考试使用的简单办法)
- 一般算数表达式转换成后缀式问题
- 第九届河南省程序设计大赛-NYOJ-1272-表达式求值(中缀式转后缀式 逆波兰表达式)
- 如何将中缀式转化成前缀式和后缀式(波兰和逆波兰)结合二叉树(适合数据结构方面的理解)
- NYOJ-35-表达式求值(中缀式转后缀式 逆波兰表达式)
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 寒假第三天--栈和队列--数据结构实验之栈二:一般算术表达式转换成后缀式
- 一般算术表达式转换成后缀式
- Java求解逆波兰表达式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- SDUT2132--一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式(手写栈)
- SDUT 2132 数据结构实验之栈二:一般算术表达式转换成后缀式
- 数据结构实验之栈二:一般算术表达式转换成后缀式