中缀表达式转换成后缀表达式 -- 栈

来源:互联网 发布:致远oa软件下载 编辑:程序博客网 时间:2024/05/16 18:27

为什么要转换

后缀表达式严格按照从左到右进行计算的模式,符合计算机运行方式,而中缀表达式需要计算机遇到符号后向后扫描一位,若为括号或优先级更高的操作符还需要向后继续扫描。

如何转换

设我们欲将中缀表达式 a+b*c+(d*e+f)*g转换成后缀表达式,正确的答案为:abc*+de*f+g*+

转换步骤

    当我们读入操作数的时候,立即将其放入到输出中,操作符不立即输出,将其放入栈中。如果我们见到一个右括号,那么我们就从栈中弹出栈元素直至遇到一个左括号,左右括号都只被弹出而不输出。

   如果我们见到任何其他的符号+ * (,那么我们从栈中弹出栈元素,直至发现优先级更低的元素为止,但是有一个例外: 除非是在处理一个)的时候,否则我们绝不从栈中移除(,+的优先级最低,(的优先级最高,当从栈中弹出元素的工作完成后,我们再将其操作符压入栈中。

  最后,如果我们读到输入的末尾,我们将栈元素弹出直至该栈变成空栈,将符号写到输出中。


举例说明

规则很多,还是用实例比较容易说清楚整个过程。以上面的转换为例,输入为a + b * c + (d * e + f)*g,处理过程如下:

1)首先读到a,直接输出。

2)读到“+”,将其放入到栈中。

3)读到b,直接输出。

此时栈和输出的情况如下:

 

4)读到“*”,因为栈顶元素”+”优先级比” * ” 低,所以将” * “直接压入栈中。

5)读到c,直接输出。

此时栈和输出情况如下:

 

6)读到” + “,因为栈顶元素” * “的优先级比它高,所以弹出” * “并输出, 同理,栈中下一个元素” + “优先级与读到的操作符” + “一样,所以也要弹出并输出。然后再将读到的” + “压入栈中。

此时栈和输出情况如下:

 

7)下一个读到的为”(“,它优先级最高,所以直接放入到栈中。

8)读到d,将其直接输出。

此时栈和输出情况如下:

 

9)读到” * “,由于只有遇到” ) “的时候左括号”(“才会弹出,所以” * “直接压入栈中。

10)读到e,直接输出。

此时栈和输出情况如下:

 

11)读到” + “,弹出” * “并输出,然后将”+”压入栈中。

12)读到f,直接输出。

此时栈和输出情况:

 

 

13)接下来读到“)”,则直接将栈中元素弹出并输出直到遇到”(“为止。这里右括号前只有一个操作符”+”被弹出并输出。

 

14)读到” * “,压入栈中。读到g,直接输出。

 

15)此时输入数据已经读到末尾,栈中还有两个操作符“*”和” + “,直接弹出并输出。

至此整个转换过程完成。程序实现代码后续再补充了。

 

 2.3)转换的另一种方法

1)先按照运算符的优先级对中缀表达式加括号,变成( ( a+(b*c) ) + ( ((d*e)+f) *g ) )

2)将运算符移到括号的后面,变成((a(bc)*)+(((de)*f)+g)*)+

3)去掉括号,得到abc*+de*f+g*+