前缀表达式/中缀表达式/后缀表达式
- 中缀表达式就是平常的表达式,如
(3+4)*5-6=29
前缀表达式又称为波兰式,也就是运算符位于数字前面,如 -*+3456
后缀表达式又称为逆波兰式,也就是运算符位于数字后面,如 3 4 + 5 × 6 -
后缀表达式转为中缀表达式要点:遇到操作数都进栈,等到碰到运算符就把栈顶两个元素出栈,运算后再入栈,直到结束。
1. a入栈,b入栈,`栈为 a b`
2. 遇到运算符+,b出栈,a出栈,运算为(a+b),再入栈,栈为`(a+b)`
3. c入栈,d入栈,栈为`(a+b) c d`
4. 遇到运算符+,d出栈,c出栈,运算为(c+d),入栈,结果为`(a+b) (c+d)`
5.遇到运算符*,栈顶两个元素出栈,运算结果为(a+b)*(c+d)
- 后缀表达式转中缀表达式,“3 4 + 5 × 6 -” => ((3+4)*5)-6 => 29
中缀表达式转为后缀表达式(从左到右扫描)
分为两个栈,结果栈和运算栈,遇到的情况有
1. 如果是操作数(数字、字母),则进入结果栈
2. 如果是左括号,那么入运算栈;
3. 如果是右括号,那么把运算栈的栈顶元素出栈,入栈到结果栈,知道遇到左括号,遇到左括号后,这一对括号都消灭
4.1 如果是运算符,如果运算栈为空,那么入栈
4.2 如果是运算符,此时运算栈顶运算符不为左括号!!!,且栈里不存在优先级大于或等于该运算符的运算符,则该运算符入栈,
否则大于等于该运算符的其他运算符先出栈再入栈到结果栈
4.3 如果是运算符,此时栈顶运算符是左括号,那么入栈
- 已知一算数表达式的中缀表达式为 a*f+(b-c/d)*e,其后缀形式
- 首先a是操作数,进结果栈;
结果栈为 a
-
- f是操作数,进结果栈
结果栈为 a f
- +是运算符,但是栈中存在优先级大于等于的*,所以 * 先出栈,然后 * 入运算栈
结果栈为 a f *
- (是左括号,入运算栈,
运算栈为 + (
- b是操作数,入结果栈,
结果栈 a f * b
- -是运算符,栈顶元素是左括号,所以-入运算栈
运算栈 + ( -
- c是操作数,入结果栈,
结果栈 a f * b c
- /是运算符,运算栈顶元素不是左括号,
运算栈 + ( -
不存在优先级大于等于 / 的元素,所以 / 入运算栈 - d是操作数,d入结果栈,
结果栈 a f * b c d
- )是右括号,所以运算栈的栈顶元素出栈,知道左括号,入栈后进到结果栈
- 此时运算栈是
+ ( - /
,所以结果栈变为 a f * b c d / -
,运算栈变为 +
,左右括号消灭了 - 然后*是运算符,运算栈中不存在大于等于的元素,所以入运算栈,运算栈为
+ *
- e是操作数,e入结果栈,结果栈为
a f * b c d / - e
, - 扫描结束,所以运算栈全部出栈到结果栈,为
a f * b c d / - * +