前缀【运算符+操作数+操作数】 中缀【操作数+运算符+操作数】后缀【操作数+操作数+运算符】
首先明确:
- 前缀中缀后缀三者之间的转换只会影响运算符的顺序,而不会影响操作数的顺序。
- 前缀和后缀是没有界定符(即括号)的表达式,运算符的排列顺序就是整个表达式的运算顺序。而中缀表达式作为日常的表达式,需要我们计算时判断运算的优先顺序。中缀转后缀即是判断运算符优先级的过程。
按顺序遍历中缀表达式,
-
由于中缀转后缀只会改变运算符的执行顺序而操作数的顺序不变,每次遍历到操作数时,直接放入后缀表达式即可。
-
当碰到括号时,相当于碰到一个严格的墙壁,在日常计算中,如果没有算出“()”内的值,是无法和其他操作数结合起来运算的,所以括号内的运算符一定是优先运算的
-
遍历到运算符的时候,单独一个运算符无法判断它的优先级(因为他的右操作数可能还有其他运算要先进行),先将他存入栈中(这里的栈存放无法确定优先级的运算符),当遍历到下一个运算符的时候和栈顶无法确定优先级的运算符进行比较,首先和栈顶进行比较,明显知道栈顶运算符和当前运算符中间夹着一个操作数,根据计算时的规则,操作数一定会选择优先级高的操作符进行结合运算。
- 如果栈顶运算符的优先级高于当前遍历的操作符,那么之前因为不确定而压入的栈顶运算符已知我后一个运算符是优先级比我低的,右操作数一定会和我先结合。运算顺序已确定,弹出栈。
- 如果栈顶运算符优先级等于当前的,那么根据“左优先”原则,优先执行栈顶运算符,栈顶运算符弹出栈
- 如果栈顶运算符优先级低于当前遍历的操作符,说明现在还算不了,一定不会先执行栈顶运算符,那么你的运算顺序就得靠后了,但其实目前也无法确定能否优先执行当前的符号,因为与当前相连的右操作数可能被括号这种优先级更高的符号限制住了 ,也是无法判断当前符号的优先级,把当前操作符压入栈
(万一栈顶运算符优先级高,但是他的左边的操作数要和其他人进行结合(即栈顶的前一个运算符优先级比栈顶元素高) 怎么能让我先结合呢? 实际上这种情况不可能出现,因为如果出现这种情况,在遍历到栈顶元素的时候一定会让优先级高的先出去运算,不可能留下来,内含一个递归的思想,从第一个元素当栈顶开始,我优先级高或等于便利的运算符,我就会出去,(此时这就是第一个操作符 前面谁都不能限制我)低于的只能存在栈里面,只能等待优先级高的都算好了我再出去算)
其实本质上就是能算你就算 不能算先压入栈里面,因为还没到你算的时候,等轮到你了 最后算的只剩两个操作数了你总能算了吧
真是写烦了 写的我自己都不懂了