中缀转后缀-如何理解,为什么用栈,代码的思路?

先考虑优先级全部都一样的情况,具体例子就是:a-b+c-d

1.先看a-b如何转换成后缀,就是直接运算符提到式子后面:ab-。并将ab-合并成一个新的符号。

2.接下来处理(ab-)+c,加上括号是为了方便理解,实际操作时不加括号。

思路与1一样,变成(ab-)c+。合并为新符号ab-c+。

3.处理(ab-c+)-d,直接给出答案:ab-c+d-。

 

从以上流程可以总结出代码的思路:

主体思路

每读出一个完整的表达式,也就是如同a-b,我们就其处理成后缀表达式,也就是ab-的形式。

并且在之后把ab-当作一个整体来看待,参与下一个表达式的运算。

具体步骤

我们可以设置三个变量,first、second、op。以a-b+c为例:

1.我们将a读入first,-读入op中,b读入second。

读完b以后,就可以开始运算了,将运算的结果ab-放入first中,开始下一个循环。

2.将+读入op中,c读入second中,然后开始运算。过程与上面类似。

不断循环,最后first中保存的就是我们要的结果。

 

我们可以用bag(栈或队列都可以)来化简我们上述步骤。此处以栈为例。

用栈来保存运算需要的两个符号。以a-b+c为例,a和b依次入栈。-暂存在op变量中。

当栈中含有两个元素的时候,就将栈中的元素弹出,参与运算变成后缀表达式,变成ab-,将ab-压入栈中。

不断循环,最后栈里只剩下一个元素的时候就是最终答案。

 

接下来考虑存在多种优先级的情况,我们研究两个例子。

1. a*b-c

我们可以直接对a*b进行变换,因为它的优先级比后面的-c高,所以处理成ab*。

接下来是(ab*)-c,处理成ab*c-。

2. a-b/c+d

此时我们不能直接读出一个表达式,如a-b,就直接将其变成ab-。

因为b/c的优先级更高,并且后面的+d部分,优先级不如b/c高,所以我们应该先处理b/c,将其转换为bc/。

 

从具体的例子中,总结出思路:

我们将整个表达式给细分为多个表达式:

 

  a-b/c+d 对应上图就是:

如何处理当前表达式,是跟后续表达式有关的。

如果当前表达式优先级很高,它的下一个表达式优先级小于等于它,那么就可以直接将当前表达式处理为后缀表达式。

否则,应该先转换后一个表达式。

在该例子中,a-b明显不如b/c高,所以应该处理b/c先。

处理b/c时,也要判断,后续表达式的优先级。在这个例子中,并没有更高的优先级。

所以我们直接处理b/c,将其转换成bc/。

 

以上流程,我们可以发现,我们每读出一个完整的表达式时,都不会立刻处理,而是先放在一旁。

如果优先级的情况为:

 

 也就是说表达式1的优先级小于表达式2,表达式2小于表达式3。

那么,我们读完1,放在一旁,读2,放在一旁,直到3,后面没有表达式了,我们将此时可以直接处理3。

处理完3后,我们处理2,接着处理1。

可以发现,该过程就是一个的调用过程。

 

受篇幅限制,更加具体的代码实现,请参考其他博文。

posted @ 2021-05-30 12:58  tchj  阅读(346)  评论(0编辑  收藏  举报