前面已经提到,计算机计算表达式的值是通过后缀表达式实现的
A+B*(C-D)-E/F是我们一般生活中经常见到的中缀表达式,
转换为后缀表达式变为ABCD-*+EF/-,虽然转换可以通过手动添加括号并且后移实验,那么在计算机中如何进行这种转换呢。
计算机中转后仍然要用到栈。
对于待转换序列A+B*(C-D)-E/F,如果是操作数,则直接输出,如果是操作符,则压入栈中。当栈中存在操作符时,又有新的操作符时,需要判断栈中和栈外的操作符优先级,做出相应判断,若栈外运算符优先级较高时,压入栈;若栈外运算符优先级较低,从栈顶逐步弹出比当前运算符优先级高或者相等的运算符。
操作符 | 栈中优先级 | 站外优先级 |
---|---|---|
( | 1 | 6 |
*/ | 5 | 4 |
± | 3 | 2 |
) | 6 | 1 |
可简单记为:同等级的,栈中高,栈外低;不同等级的,依然是先运算的较高
从上表可以看出,出现’(‘时,直接入栈。当出现’)‘时,需要逐个弹出栈中元素,直到出现’(’,并从栈中删去’(’。
A+B*(C-D)-E/F处理过程如下 栈中左边代表栈顶
待处理 | 栈中 | 输出 |
---|---|---|
A+B*(C-D)-E/F | ||
+B*(C-D)-E/F | A | |
B*(C-D)-E/F | + | A |
*(C-D)-E/F | + | AB |
(C-D)-E/F | *+ | AB |
C-D)-E/F | (*+ | AB |
-D)-E/F | (*+ | ABC |
D)-E/F | -(*+ | ABC |
)-E/F | (*+ | ABCD |
-E/F | *+ | ABCD- |
E/F | - | ABCD-*+ |
/F | - | ABCD-*+E |
F | /- | ABCD-*+E |
null | /- | ABCD-*+EF |
null | null | ABCD-*+EF/- |