以 (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依次弹出得到前缀表达式