表达式求值事程序设计语言编译中一个最基本的问题,他的实现是栈应用中i有一个典型范例。
中缀表达式不仅以来运算符的优先级,而且还要处理括号
后缀表达式已经考虑了运算符的优先级,没有括号,只有操作数和运算符
一、中缀表达式转后缀表达式
1.1中转后表达式的方法
- 遇到操作数:直接输出
- 遇到界限符:遇到
(
直接入栈,直到遇到)
,则依次弹出栈内运算符并加入到后缀表达式中,直到弹出(为止,
注意:(不输出
3.遇到运算符:依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到(或栈空则停止,之后再把当前运算符入栈。
1.2实例1
-
9是数字直接输出
此时后缀表达式为9 -
+和(是符号进栈
-
3是数字直接输出
此时后缀表达式为9 3 -
-和是符号进栈
-
1是数字直接输出
此时后缀表达式为9 3 1
此时栈中元素有从栈底元素依次向栈顶表示+ ( -
-
)是右括号,匹配左括号,所以栈顶符号依次出栈,直到(,但是(不输出
此时后缀表达式为9 3 1 -
此时栈中元素有从栈底元素依次向栈顶表示+
-
*和是符号进栈
-
3是数字直接输出
此时后缀表达式为9 3 1 - 3
此时栈中元素有从栈底元素依次向栈顶表示+ *
-
此时中缀表达式走到+号了,+是符号,的优先级大于当前+,所以出栈(并且栈中符号优先级都不小于当前+,所以全部出栈,意思就是此时在栈底元素的+也要出栈),接着+入栈
此时后缀表达式为9 3 1 - 3 * +
此时栈中元素有从栈底元素依次向栈顶表示+
(此时+是最新入栈的+) -
10是数字直接输出
此时后缀表达式为9 3 1 - 3 * + -
/是符号直接进栈
-
2是数字直接输出
此时后缀表达式为9 3 1 - 3 * +
13.最后将栈中的符号依次输出
1.3实例2
将前缀表达式a/b+(c*d-e*f)/g
转化为等价的后缀表达式
- 步骤1:按照运算符优先级对所有的运算单位加括号
((a/b)+(((c*d)-(e*f)) / g))
- 步骤2:转换为前缀或后缀表达式
- 这边我们转换为后缀表达式:把运算符号移动到对应的括号后面
((ab)/(((cd)*(ef)*)-g)/)+
- 步骤3:把括号去掉
ab/cd*ef*-g/+
二、后缀表达式的计算
2.1方法(从左边到右扫描)
遇到数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果
2.2实例
- 9 3 1依次进栈
- 遇到-,那么栈顶元素1 和 3出栈,先出栈的在右操作数,为3-1=2
- 再将结果2进栈
- 3进栈
- 遇到那么栈顶元素3 和 2出栈,表达式为23=6
- 再将结果6进栈
- 遇到+那么栈顶元素9 和 6出栈,表达式9+6=15
- 再将结果15进栈
- 再将表达式中的 10 2进栈
此时栈中元素 从栈底元素依次向栈顶:15 10 2 - 遇到/那么栈顶元素10和 2出栈,表达式10/2=5
- 再将结果中的5进栈
此时栈中元素 从栈底元素依次向栈顶:15 5 - 遇到+那么栈顶元素5 和 15出栈,表达式15+5=20
所以结果为20
三、前缀表达式的计算
3.1方法(从右边到左边扫描)
方法与后缀表达式类似