【数论】4 & 【CSP第一轮】1 前缀、中缀、后缀表达式

1.中缀表达式

我们平时见到的算式大多是中缀表达式。

如这个式子就是中缀表达式: 3 + 4 ∗ 5 − 6 3+4*5-6 3+456

我们计算的时候,通常会按照脱式运算,即从左往右进行计算。特别的,有括号先算括号里的,然后先算乘除后算加减。

对于上式,计算过程是这样的:
         3 + 4 ∗ 5 − 6 = 3 + 20 − 6 = 23 − 6         = 17                \ \ \ \ \ \ \ \ 3+4*5-6 \\ = 3+20-6 \\ = 23-6\ \ \ \ \ \ \ \\ = 17 \ \ \ \ \ \ \ \ \ \ \ \ \ \         3+456=3+206=236       =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(54) ∗ *
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(236) − -

因此,计算结果为 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+456
后缀表达式 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+456 转成前缀表达式,那么计算过程可以是这样的:

  1. 先确定数字之间的顺序,即 3   4   5   6 3 \ 4 \ 5 \ 6 3 4 5 6
  2. 根据计算顺序添加运算符号。如在计算这个中缀表达式中,我们先计算 4 ∗ 5 4*5 45 ,所以我们计算是需要优先在 4 , 5 4,5 4,5 的前面添加运算符 ∗ * 。这样一来,计算前缀表达式时,从右往左扫描到 ∗   4   5 * \ 4 \ 5  4 5 时,这是栈顶一定是 4 , 5 4,5 4,5 ,那么一定优先计算 4 ∗ 5 4*5 45
  3. 根据第2步(即根据运算顺序添加符号即可)。

还有一种更为简便的方法:

  1. 先根据运算顺序把中缀表达式全部添加上合法的括号,即 3 + 4 ∗ 5 − 6 = ( ( 3 + ( 4 ∗ 5 ) ) − 6 ) 3+4*5-6 = ((3+(4*5))-6) 3+456=((3+(45))6)
  2. 然后把括号内的所有运算符放在括号前得到前缀表达式,即 ( ( 3 + ( 4 ∗ 5 ) ) − 6 ) ((3+(4*5))-6) ((3+(45))6) 变成 −   +   3   ∗   4   5   6 - \ + \ 3 \ * \ 4 \ 5 \ 6  + 3  4 5 6

后缀表达式同理,只需要更改放在括号前后的顺序或扫描方式即可。

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值