比如中缀表达式
A
×
B
/
C
A\times B/C
A×B/C变成后缀表达式
A
B
×
C
/
AB\times C/
AB×C/。
为什么要使用后缀表达式
在我们的认知中,我们接触一般都是中缀表达式,例如:
A
+
B
A+B
A+B、
A
/
B
−
C
+
D
×
E
−
A
×
C
A/B-C+D\times E-A\times C
A/B−C+D×E−A×C等;
但在计算机中,如果是像
A
+
B
A+B
A+B这样简单的计算不用太多思考,但对于像
A
/
B
−
C
+
D
×
E
−
A
×
C
A/B-C+D\times E-A\times C
A/B−C+D×E−A×C这样甚至还要稍复杂的表达式,我们要考虑到计算符优先级的问题,将其转为
(
(
(
(
A
/
B
)
−
C
)
+
(
D
×
E
)
)
−
(
A
×
C
)
)
((((A/B)-C)+(D\times E))-(A\times C))
((((A/B)−C)+(D×E))−(A×C))才能进行计算;
尤其涉及到计算符优先级的表达式时,如果直接计算中缀表达式就显得有些复杂了,这里我可以将其转换为后缀表达式进行计算,以
A
/
B
−
C
+
D
×
E
−
A
×
C
A/B-C+D\times E-A\times C
A/B−C+D×E−A×C为例:
中缀
后缀
A
/
B
−
C
+
D
×
E
−
A
×
C
A/B-C+D\times E-A\times C
A/B−C+D×E−A×C
A
B
/
C
−
D
E
×
+
A
C
×
−
AB/C-DE\times +AC\times -
AB/C−DE×+AC×−
A
B
/
C
−
D
E
×
+
A
C
×
−
AB/C-DE\times +AC\times -
AB/C−DE×+AC×−计算过程如下:
操作
后缀表达式
T
1
=
A
/
b
T_1=A/b
T1=A/b
T
1
C
−
D
E
×
+
A
C
×
−
T_1C-DE\times +AC\times -
T1C−DE×+AC×−
T
2
=
T
1
−
C
T_2=T_1-C
T2=T1−C
T
2
D
E
×
+
A
C
×
−
T_2DE\times +AC\times -
T2DE×+AC×−
T
3
=
D
×
E
T_3=D\times E
T3=D×E
T
2
T
3
+
A
C
×
−
T_2T_3+AC\times -
T2T3+AC×−
T
4
=
T
2
+
T
3
T_4=T_2+T_3
T4=T2+T3
T
4
A
C
×
−
T_4AC\times -
T4AC×−
T
5
=
A
×
C
T_5=A\times C
T5=A×C
T
4
T
5
−
T_4T_5-
T4T5−
T
6
=
T
4
−
T
5
T_6=T_4-T_5
T6=T4−T5
T
6
T_6
T6
实现方法
我们应该先了解各种操作符的优先级
优先级
操作符
1
一
目
减
(
负
号
)
,
!
一目减(负号),!
一目减(负号),!
2
∗
,
/
,
*,/,%
∗,/,
3
=
,
−
=,-
=,−
4
<
,
<
=
,
>
,
>
=
<,<=,>,>=
<,<=,>,>=
5
=
=
,
!
=
==,!=
==,!=
6
且
且
且
7
或
或
或
我们可以用数据机构-栈来存储操作符,以表达式
A
×
(
B
+
C
)
×
D
A\times (B+C)\times D
A×(B+C)×D为例 ,过程如下表: