用栈对表达式求值就要想到前缀表达式和后缀表达式了,后缀表达式方便一些。栈由于先进后出和后进先出的原则,所以后缀表达式求值的算法思路简单是:读取后缀表达式,遇到操作数就进栈,遇到操作符的时候,先从栈中连续取出两个操作数,计算出值然后结果进栈。
那么问题来了,怎么将常规表达式转化成后缀表达式?
以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*+