常规表达式转化为后缀表达式的两种方法

用栈对表达式求值就要想到前缀表达式和后缀表达式了,后缀表达式方便一些。栈由于先进后出和后进先出的原则,所以后缀表达式求值的算法思路简单是:读取后缀表达式,遇到操作数就进栈,遇到操作符的时候,先从栈中连续取出两个操作数,计算出值然后结果进栈。

那么问题来了,怎么将常规表达式转化成后缀表达式?

a*b+(c-d/e)*f为例

方法一:

1,遇到操作数直接输出到后缀表达式

2,遇到操作符

(1)没遇到括号时,如果当前操作符优先级高于栈顶(栈顶预设为#,优先级小于一切),则直接进栈。如果当前优先级小于或等于栈顶,则栈顶元素输出到后缀表达式,一直到当前优先级高于栈顶时停止

(2)遇到括号的情况,先遇到左括号时,不用管,直接放进栈,然后一切照旧,最后遇到右括号时,将左括号后的操作符依次输出到后缀表达式,左括号也弹出但是不输出到表达式

(3)最后一个操作数也输出后,将栈内的剩余操作符依次输出 

a*b+(c-d/e)*f:输出a,*进栈,b输出,+优先级低于*,*输出,+进栈,(进栈,c输出,-进栈,d输出,/优先级高于-,/进栈,e输出,遇到右括号输出/输出-弹出(,*优先级大于+,*进栈,输出f,输出*,输出+,得到ab*cde/-f*+

方法二

加括号,将表达式中的小式子都加上括号,让每个操作符都能匹配一个括号,再将操作符移到对应括号右边,最后去掉括号

a*b+(c-d/e)*f:加括号后得((a*b)+((c-(d/e))*f)),右移操作符得((ab)*((c(de)/)-f)*)+,去掉括号得ab*cde/-f*+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值