运算符的优先级考虑
将中缀表达式转换为相应的后缀表达式,需要根据操作符的优先级来进行栈的变化,我们用icp来表示当前扫描的运算符ch的优先级,该运算符进栈后的优先级为isp,则运算符的优先级如下表所示:
isp是栈内优先,icp是栈外优先。
操作符 | # | ( | * / | + - | ) |
---|---|---|---|---|---|
isp | 0 | 1 | 5 | 3 | 6 |
icp | 0 | 6 | 4 | 2 | 1 |
例子
将中缀表达式 a+b-a*((c+d)/e-f)+g 转为后缀表达式
步骤 | 扫描项 | 项类型 | 动作 | 栈内内容 | 输出 | 输出序列 |
---|---|---|---|---|---|---|
0 | '#'进栈,读下一个符号 | # | ||||
1 | a | 操作数 | 直接输出 | # | a | a |
2 | + | 操作符 | isp(’#’)<icp(’+’),进栈 | # + | a | |
3 | b | 操作数 | 直接输出 | # + | b | ab |
4 | – | 操作符 | isp(’+’)>icp(’-’),退栈并输出 | # | + | ab+ |
5 | isp(’#’)<icp(’ - ') ,进栈 | # - | ||||
6 | a | 操作数 | 直接输出 | # - | a | ab+a |
7 | * | 操作符 | isp(‘-’)<icp(’ * '),进栈 | # - * | ab+a | |
8 | ( | 操作符 | isp(‘*‘)<icp(’ ( ') ,进栈 | # - * ( | ab+a | |
9 | ( | 操作符 | isp(’ ( ‘)<icp(’ ( ') ,进栈 | # - * ( ( | ab+a | |
10 | c | 操作数 | 直接输出 | # - * ( ( | c | ab+ac |
11 | + | 操作符 | isp(’ ( ‘)<icp(’ + '),进栈 | # - * ( ( + | ab+ac | |
12 | d | 操作数 | 直接输出 | # - * ( ( + | d | ab+acd |
13 | ) | 操作符 | isp(’+’)>icp(’)’),退栈并输出 | # - * ( ( | + | ab+acd+ |
14 | isp(’(’)==icp(’ ) ') ,直接退栈 | # - * ( | ab+acd+ | |||
15 | / | 操作符 | isp(’(’)<icp(’/’),进栈 | # - * ( / | ab+acd+ | |
16 | e | 操作数 | 直接输出 | # - * ( / | e | ab+acd+e |
17 | - | 操作符 | isp(’/’)>icp(’-’) ,退栈并输出 | # - * ( | / | ab+acd+e/ |
18 | isp(’(’)<icp(’-’),进栈 | # - * ( - | ab+acd+e/ | |||
19 | f | 操作数 | 直接输出 | # - * ( - | f | ab+acd+e/f |
20 | ) | 操作符 | isp(’-’)>icp(’)’) ,退栈并输出 | # - * ( | - | ab+acd+e/f- |
21 | isp(’(’)==icp(’)’),直接退栈 | # - * | ab+acd+e/f- | |||
22 | + | 操作符 | isp(’*’)>icp(’+’) ,退栈并输出 | # - | * | ab+acd+e/f-* |
23 | isp(’-’)>icp(’+’) ,退栈并输出 | # | - | ab+acd+e/f-*- | ||
24 | isp(’#’)<icp(’+’) ,进栈 | # + | ab+acd+e/f-*- | |||
25 | g | 操作数 | 直接输出 | # + | g | ab+acd+e/f-*-g |
26 | # | 操作符 | isp(’+’)>icp(’#’) ,退栈并输出 | # | + | ab+acd+e/f-*-g+ |
27 | isp(’#’)>icp(’#’) ,退栈结束 | ab+acd+e/f-*-g+ |
即相应的后缀表达式为 ab+acd+e/f-*-g+ 。