前缀表达式以及后缀表达式的出现是为了让计算机的运算更加简便。因为计算机需要对中缀表达式进行优先级运算。
注:无论何种表达式,其三种表达式的字母顺序永远相同。
中缀表达式->前/后缀表达式
前缀
思想:按照优先级顺序将操作数成对取出,注意运算符在前,操作数在后。
例:中缀表达式 a + ( b + c ) ∗ d a + (b + c) * d a+(b+c)∗d
优先级:(b+c) > *d > a+
+bc 式子①
按照顺序取出式子①和*d,得到表达式:
+bc * d
+bc * d 式子②
按照顺序取出式子②和a+,得到最终表达式:
+
a
∗
+
b
c
d
+a * + bc d
+a∗+bcd
后缀
思想:按照优先级顺序将操作数成对取出,注意操作数在前,运算符在后。
例:中缀表达式 a + ( b + c ) ∗ d a + (b + c) * d a+(b+c)∗d
优先级:(b+c) > *d > a+
bc+ 式子①
按照顺序取出式子①和*d,得到表达式:
b c + d *
b c + d * 式子②
按照顺序取出式子②和a+,得到最终表达式:
a
b
c
+
d
∗
+
a b c + d * +
abc+d∗+
前/后缀表达式->中缀表达式
前缀
按照右->左的顺序入栈
遇到运算符,按照左->右的顺序出栈,再将转换后的表达式入栈
例:前缀表达式 + a ∗ + b c d +a * + bc d +a∗+bcd
- 入栈:d c b
- 遇到操作符+,弹出bc 得到式子①b+c 将式子①入栈
此时栈内元素:d ① - 遇到操作符*,弹出d与① 得到式子②(b+c)*d 将式子②入栈
此时栈内元素:② - 入栈:② a
- 遇到操作符+,弹出②与a 得到最终表达式: a + ( b + c ) ∗ d a+(b+c)*d a+(b+c)∗d
后缀
按照左->右的顺序入栈
遇到运算符,按照右->左的顺序出栈,再将转换后的表达式入栈
例:后缀表达式 a b c + d ∗ + a b c + d * + abc+d∗+
- 入栈:a b c
- 遇到操作符+,弹出bc 得到式子①b+c 将式子①入栈
此时栈内元素:a ① - 入栈:a ① d
- 遇到操作符*,弹出d与① 得到式子②(b+c)*d 将式子②入栈
此时栈内元素:a ② - 遇到操作符+,弹出②与a 得到最终表达式: a + ( b + c ) ∗ d a+(b+c)*d a+(b+c)∗d