前缀、后缀表达式(波兰式、逆波兰式)

以 (3+4)x5-6 为例子,求前后缀表达式。

中缀表达式:(3+4)x5-6    前缀表达式:-x+3456   后缀表达式:34+5x6-

通用解法如下

一. 前缀表达式(波兰式)

1. 计算方法

①从右到左扫描

②遇到数字入栈

③遇到运算符出栈两个数字进行计算,计算结果再入栈

④扫描结束后把数字出栈就是计算结果

2. 中缀表达式→前缀表达式

(需要用到两个栈S1和S2)

①从右到左扫描中缀表达式

②遇到数字压入S2

③遇到操作符,与S1的栈顶比较

a.如果S1为空,或者栈顶是 ),直接入栈S1

b.否则,如果符号优先级比栈顶高或者相等,直接入栈S1

c.否则,S1顶出栈,压入S2。然后继续回到步骤a比较。

④遇到括号的时候

a. ) :直接压入S1

b. ( :依次把S1弹出,压入S2,直到遇上 )。括号可以丢弃

⑤重复上述扫描步骤,直到扫描完成

⑥S1中如果还有元素,全部弹出压入S2

⑦S2依次弹出得到前缀表达式

二. 后缀表达式(逆波兰式)

1. 计算方法

(与前缀表达式计算类似,不同点是变成:从左到右扫描)

①从左到右扫描

②遇到数字入栈

③遇到运算符出栈两个数字进行计算,计算结果再入栈

④扫描结束后把数字出栈就是计算结果

2. 中缀表达式→后缀表达式

(和前缀表达式类似,不同点在于:左右括号颠倒,扫描从左到右)

①从左到右扫描中缀表达式

②遇到数字压入S2

③遇到操作符,与S1的栈顶比较

a.如果S1为空,或者栈顶是 (,直接入栈S1

b.否则,如果符号优先级比栈顶高或者相等,直接入栈S1

c.否则,S1顶出栈,压入S2。然后继续回到步骤a比较。

④遇到括号的时候

a. ( :直接压入S1

b. ) :依次把S1弹出,压入S2,直到遇上 ( 。括号可以丢弃

⑤重复上述扫描步骤,直到扫描完成

⑥S1中如果还有元素,全部弹出压入S2

⑦S2依次弹出得到前缀表达式

猜你喜欢

转载自blog.csdn.net/weixin_39731083/article/details/81667043