后缀表达式
不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *
中缀表达式
是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。
前缀表达式
前缀表达式就是不含括号的算术表达式,而且它是将运算符写在前面,操作数写在后面的表达式,为纪念其发明者波兰数学家Jan Lukasiewicz也称为“波兰式”。例如,- 1 + 2 3,它等价于1-(2+3)。
使用栈,可以实现中缀表达式向后缀表达式的转化。
例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+
转换原则:
1.当读到一个操作数时,立即将它放到输出中。操作符则不立即输出,放入栈中。遇到左圆括号也推入栈中。
2.如果遇到一个右括号,那么就将栈元素弹出,将符号写出直到遇到一个对应的左括号。但是这个左括号只被弹出,并不输出。
3.在读到操作符时,如果此时栈顶操作符优先性大于或等于此操作符,弹出栈顶操作符直到发现优先级更低的元素位置。除了处理)的时候,否则决不从栈中移走"("。操作符中,+-优先级最低,()优先级最高。
4.如果读到输入的末尾,将栈元素弹出直到该栈变成空栈,将符号写到输出中。
关键点:1.只有操作符进栈,操作数放在输出中。
2.当一个操作符进栈时,栈中不能有优先级比自己大或者相同的操作符。
3.左括号直接进栈,遇右括号时,栈中元素一直出栈直到左括号。
解如下:
首先,读入a,并送到输出,然后+被读入并压入栈中。接下来b读入并送到输出,此时状态如下:
stack: 输出:a b
+
back top
接下来读入*,由于优先性比栈顶元素+大(原则3),因此被压入栈顶,接着读入c,并送到输出:
stack: 输出:a b c
+ *
back top
然后读入+,由于此时栈顶元素为*,优先级比+大,因此将*弹出,弹出后原来的+变成栈顶元素,由于+的优先性和当前读入的+优先性相等,因此也被弹出(原则3),最后将读入的+压入栈中。因此此时状态如下:
stack: 输出:a b c * +
+
back top
下一个读入的符号是(,由于具有最高优先级,因此将其放入栈中,然后读入d:
stack: 输出:a b c * + d
+ (
back top
继续读入,此时读入*,除非处理),否则(决不弹出(原则3),因此*被压入栈中,接下来读入e,并送到输出:
stack: 输出:a b c * + d e
+ ( *
back top
再往后读入的符号是+,将*弹出并输出。(原则3,与之前步骤相似),然后将+压入栈中,接着读入f并送到输出:
stack: 输出:a b c * + d e * f
+ ( +
back top
现在读入),因此弹出栈元素直到遇到“(”(原则2):
stack: 输出: a b c * + d e * f +
+
back top
下面又读入一个*,被压入栈中,然后读入g并输出:
stack: 输出: a b c * + d e * f + g
+ *
back top
现在输入为空,弹出栈中所有元素:
stack : 输出: a b c * + d e * f + g * +
empty