中缀,后缀,前缀表达式转换(复习)


前言

中缀表达式转后缀表达式,后缀表达式转中缀表达式


提示:以下是本篇文章正文内容,下面案例可供参考

中缀转后缀方法

初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。从左至右处理各个元素,直到末尾。可能遇到三种情况:
1.遇到操作数。直接加入后缀表达式。
2. 遇到界限符 (、)。遇到 直接入栈;遇到 则依次弹出栈内运算符并加入后缀表达式,直到弹出 。注意 ( ) 不加入后缀表达式。
3. 遇到 运算符。依次弹出栈中优先级 高于或等于 当前运算符的所有运算符,并加入后缀表达式。

举例

例1: A + B * (C - D)- E / F

中缀转后缀:

转换步骤

遇到 A 操作数,写入后缀表达式:A

遇到 “ + ”(运算符)入栈

遇到 B 操作数,写入后缀表达式:AB

遇到 “ * ”(运算符),当前没有优先级 高于或等于 当前 * 运算符,依旧入栈。

遇到 界限符 " ( "入栈。

遇到 C 操作数,写入后缀表达式: ABC

遇到 - 运算符,因为 - 在括号中,不弹出。

遇到 D 操作数,写入后缀表达式: ABCD

遇到 界限符 " ) " **(参照情况二)**开始从栈内弹出运算符到 " ) " 止。

此时栈内元素:
中缀,后缀,前缀表达式转换(复习)
此时后缀表达式:ABCD -
遇到 - 运算符,入栈。此时 (参照情况三) 依次弹出 * - 运算符 (切记此时 “ - ” 不弹出)
此时栈内元素: 中缀,后缀,前缀表达式转换(复习)
此时后缀表达式:ABCD - * +

遇到 E 操作数,写入后缀表达式: ABCD - * + E

遇到 / 运算符,因为 / 的优先级高于 - ,所以入栈

遇到 F 操作数,写入后缀表达式: ABCD - * + EF

因为没有了操作数,因此将栈内元素出栈

此时栈内情况:
中缀,后缀,前缀表达式转换(复习)

后缀表达式:ABCD - * + EF / -

结束!

手算(应用考试)

例:A + B * (C - D)- E / F
按数学运算,1算(C - D),2算 B *,3算A +,4算E / F,最后算 - 。(如下图所示)

中缀,后缀,前缀表达式转换(复习)
此时开始将每个小部分看作一个整体,将每个整体的运算符放到操作数后面。

第一部分:CD -

第二部分:BCD - *

第三部分:ABCD - * +

第四部分:EF /

第五部分:ABCD - * + E F / -


后缀转中缀方法

  1. 从左往右扫描下一个元素,直到处理完所有元素
  2. 若扫描到 操作数 则压入栈中,并回到 步骤1 ;否则执行 步骤3
  3. 若扫描到 运算符 ,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到1。

例: ABCD - * + E F / -

遇到 A 操作数,压入栈中

遇到 B 操作数,压入栈中

遇到 C 操作数,压入栈中

遇到 D 操作数,压入栈中

此时栈内元素:
中缀,后缀,前缀表达式转换(复习)
遇到 “ - ”(运算符),弹出两个栈顶元素,将结果压回栈顶。( D先出,C再出,运算是:C - D)

此时栈内元素:
中缀,后缀,前缀表达式转换(复习)
回到步骤1,再次扫描,此时扫描到 “ * ”(运算符),弹出两个栈顶元素,将结果压回栈顶。

此时栈内元素:
中缀,后缀,前缀表达式转换(复习)
回到步骤1,再次扫描,此时扫描到 “ + ”(运算符),弹出两个栈顶元素,将结果压回栈顶。

此时栈内元素:
中缀,后缀,前缀表达式转换(复习)
回到步骤1,再次扫描,扫描到E,入栈。

扫描到F,入栈。

此时栈内元素:
中缀,后缀,前缀表达式转换(复习)
遇到 “ / ”(运算符),弹出两个栈顶元素,将结果压回栈顶。

此时栈内元素:
中缀,后缀,前缀表达式转换(复习)
回到步骤1,再次扫描,此时扫描到 “ - ”(运算符),弹出两个栈顶元素,将结果压回栈顶。

此时栈内元素:
中缀,后缀,前缀表达式转换(复习)
此时可直接输出结果!

中缀转前缀步骤

中缀,后缀,前缀表达式转换(复习)
此时开始将每个小部分看作一个整体,将每个整体的运算符放到操作数前面。

第一部分:- CD

第二部分:* B - CD

第三部分:+ A * B - CD

第四部分:/ EF

第五部分:- + A * B - CD / EF