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

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

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值