一个数学的运算式子说明两者区别
中缀表达式:4.99 * 1.06 + 5.99 + 6.99 * 1.06。
后缀表达式:4.99 1.06 * 5.99 + 6.99 1.06 * +
这里的后、中是通过运算符在数字的位置。中:在数字之间;后:在两个数字之后。
中缀转后缀:
两个栈。一个存结果为A,一个存运算符为B。一直读取表示式。运算符通过优先级高低比大小。步骤A:
-
遇到数字直接压入A栈
-
遇到运算符c。栈B空则把c压入;否则,B弹栈得到d,与c计较
- 若 d >= c:d 入栈A,c 入栈B
- 若 d < c : d 入栈B,c入栈B
- 读取完毕,把栈B全部弹出,压入A
后缀表达式进行运算
把步骤A修改一下:
-
遇到数字直接压入A栈
-
遇到运算符c。栈B空则把c压入;否则,B弹栈得到d,与c计较
- 若 d >= c:c 入栈B;A两次弹出得到数字与d运算,得到结果压入A
- 若 d < c : d 入栈B,c入栈B
存在括号情况的中缀转后缀
还是两个栈A与B。优先级为(
> *
> +
。
有如下式子:a + b * c + (d * e + f) * g
转换后:abc * + de * f + g * +
-
遇到数字压入栈A。
-
遇到右括号
)
,B弹出元素,直到遇到左括号)
-
遇到
(
、*
、+
任何一个运算符a。B弹出元素b,如果b>=a,就一直弹出压入A;直到遇到优先级低于a的为止,把低于a的b压回B,再把a压入B -
最后到末尾把B全部弹出,压入A
来源:oschina
链接:https://my.oschina.net/u/3870422/blog/3213323