1.中缀表达式
我们平时见到的算式大多是中缀表达式。
如这个式子就是中缀表达式: 3 + 4 ∗ 5 − 6 3+4*5-6 3+4∗5−6
我们计算的时候,通常会按照脱式运算,即从左往右进行计算。特别的,有括号先算括号里的,然后先算乘除后算加减。
对于上式,计算过程是这样的:
3
+
4
∗
5
−
6
=
3
+
20
−
6
=
23
−
6
=
17
\ \ \ \ \ \ \ \ 3+4*5-6 \\ = 3+20-6 \\ = 23-6\ \ \ \ \ \ \ \\ = 17 \ \ \ \ \ \ \ \ \ \ \ \ \ \
3+4∗5−6=3+20−6=23−6 =17
2.前缀表达式
这个式子就是前缀表达式: − + 3 ∗ 4 5 6 - \ + \ 3 \ * \ 4 \ 5 \ 6 − + 3 ∗ 4 5 6
我们计算的时候,类似于计算中缀表达式的方法,但是变成了从右往左计算。
具体来说,我们尝试模拟一下上式的计算过程。(注:下表中的栈均为从右进栈出栈。)
当前扫描的字符 | 数字栈 | 运算符栈 |
---|---|---|
6 6 6 | 6 6 6 | |
5 5 5 | 6 , 5 6,5 6,5 | |
4 4 4 | 6 , 5 , 4 6,5,4 6,5,4 | |
∗ * ∗ | 6 , 20 ( 5 ∗ 4 ) 6,20(5*4) 6,20(5∗4) | ∗ * ∗ |
3 3 3 | 6 , 20 , 3 6,20,3 6,20,3 | |
+ + + | 6 , 23 ( 20 + 3 ) 6,23(20+3) 6,23(20+3) | + + + |
− - − | 17 ( 23 − 6 ) 17(23-6) 17(23−6) | − - − |
因此,计算结果为 17 17 17 。
用文字语言描述这个过程,即:
计算前缀表达式时,从右往左进行扫描。如果这一位是数字,那么将其入栈;如果这一位是运算符,那么就弹出栈顶的两个元素,并将计算结果重新入栈。反复操作直到结束即可。
3.后缀表达式
把以上的式子转为后缀表达式,形如: 3 4 5 ∗ + 6 − 3 \ 4 \ 5 \ * \ + \ 6 \ - 3 4 5 ∗ + 6 −
我们计算的时候,与计算前缀表达式的方法完全一样,但是变成了从左往右计算。
用文字语言描述这个过程,即:
计算后缀表达式时,从左往右进行扫描。如果这一位是数字,那么将其入栈;如果这一位是运算符,那么就弹出栈顶的两个元素,并将计算结果重新入栈。反复操作直到结束即可。
4.探索规律
我们来对比一下这个式子的前缀、中缀、后缀表达式。
表达式形式 | 表达式 |
---|---|
前缀表达式 | − + 3 ∗ 4 5 6 - \ + \ 3 \ * \ 4 \ 5 \ 6 − + 3 ∗ 4 5 6 |
中缀表达式 | 3 + 4 ∗ 5 − 6 3+4*5-6 3+4∗5−6 |
后缀表达式 | 3 4 5 ∗ + 6 − 3 \ 4 \ 5 \ * \ + \ 6 \ - 3 4 5 ∗ + 6 − |
很容易得出两个结论:
结论1:一个算式的前缀、中缀、后缀表达式中,符号的顺序改变,但数字的顺序不变。
结论2:前缀表达式中,最后面一定是两个数字;后缀表达式中,最前面一定是两个数字。
有了这个结论,就可以帮助我们进行各个表达式之间的转化了。
5.表达式之间的转化
通常,我们会先按照计算方法转成中缀表达式,再转成其他表达式。
那么,前缀和后缀表达式转成中缀表达式按照计算方法即可。如何把中缀表达式转为其他表达式呢?
根据 结论1 ,我们可以先确定数字之间的顺序。
例如我们要把中缀表达式的 3 + 4 ∗ 5 − 6 3+4*5-6 3+4∗5−6 转成前缀表达式,那么计算过程可以是这样的:
- 先确定数字之间的顺序,即 3 4 5 6 3 \ 4 \ 5 \ 6 3 4 5 6 。
- 根据计算顺序添加运算符号。如在计算这个中缀表达式中,我们先计算 4 ∗ 5 4*5 4∗5 ,所以我们计算是需要优先在 4 , 5 4,5 4,5 的前面添加运算符 ∗ * ∗ 。这样一来,计算前缀表达式时,从右往左扫描到 ∗ 4 5 * \ 4 \ 5 ∗ 4 5 时,这是栈顶一定是 4 , 5 4,5 4,5 ,那么一定优先计算 4 ∗ 5 4*5 4∗5。
- 根据第2步(即根据运算顺序添加符号即可)。
还有一种更为简便的方法:
- 先根据运算顺序把中缀表达式全部添加上合法的括号,即 3 + 4 ∗ 5 − 6 = ( ( 3 + ( 4 ∗ 5 ) ) − 6 ) 3+4*5-6 = ((3+(4*5))-6) 3+4∗5−6=((3+(4∗5))−6) 。
- 然后把括号内的所有运算符放在括号前得到前缀表达式,即 ( ( 3 + ( 4 ∗ 5 ) ) − 6 ) ((3+(4*5))-6) ((3+(4∗5))−6) 变成 − + 3 ∗ 4 5 6 - \ + \ 3 \ * \ 4 \ 5 \ 6 − + 3 ∗ 4 5 6 。
后缀表达式同理,只需要更改放在括号前后的顺序或扫描方式即可。