问答题 将表达式的中缀表示转换为相应的后缀表示时,需要利用栈暂存某些操作符,现有一个表达式的中缀表示:
a+b*(c-d)+e/f#
请给出转换为后缀表示时的处理过程及栈的相应变化。
※提示:运算符的优先级如下表所示,其中,icp表示当前扫描到的运算符ch的优先级,该运算符进栈后的优先级为isp,字符“#”为表达式结束符。
运算符 # ( *,/ +,- )
isp 0 1 5 3 6
icp 0 6 4 2 1
【正确答案】
【答案解析】表达式的中缀表示:a+b*(c-d)+e/f#转换为相应的后缀表示时,需要利用栈暂存某些操作符。如下表所示。
步序 扫描项 项类型 动作 栈的变化 输出
0 "#"进栈,读下一符号 #
1 a 操作数 直接输出,读下一符号 # a
2 + 操作数 isp("#")<icp("+"),进栈,读下一符号 #+
3 b 操作数 直接输出,读下一符号 #+ b
4 * 操作数 isp("+")<icp("*"),进栈,读下一符号 #+*
5 ( 操作数 isp("+")<icp("("),进栈,读下一符号 #+*(
6 c 操作数 直接输出,读下一符号 #+*( c
7 - 操作数 isp("(")<icp("-"),进栈,读下一符号 #+*(-
8 d 操作数 直接输出,读下一符号 #+*(- d
9 ) 操作数 isp("-")>icp(")"),退栈输出 #+*( -
10 Isp("(")==icp(")"),退栈,读下一符号 #+*
11 + 操作数 isp("*")>icp("+"),退栈输出 #+ *
12 isp("+")>icp("+"),退栈输出 #+ +
13 isp("#")<icp("+"),进栈,读下一符号 #+
14 e 操作数 直接输出,读下一符号 #+ e
15 / 操作数 isp("+")<icp("/"),进栈,读下一符号 #+/
16 f 操作数 直接输出,读下一符号 #+/ f
17 # 操作数 isp("/")>icp("*"),退栈输出 #+ /
18 isp("+")>icp("#"),退栈输出 # +
19 isp("#")==icp("#"),退栈,结束