中缀表达式转逆波兰表达式算法介绍

一、表达式(中缀表达式)

中缀表达式就是我们常见的表达式,比如a+b。

二、波兰表达式(前缀表达式)

a+b在前缀表达式显示为:+ab。操作符在操作数的前面

三、逆波兰表达式(后缀表达式)

a+b在后缀表达式显示为:ab+。操作符在操作数后面。
再来复杂一点:a+b*c。转化为后缀表达式:

  1. 乘号的优先级高于加号,把b*c看成整体代号为d,得到a+d
  2. 已知a+b = ab+,所以a+d = ad+
  3. 展开d,bc = bc
  4. 最后完整的后缀表达式:abc*+

再来一道题更复杂的题:(a-b)*b/c,,转化为后缀表达式;

  1. 把(a-b)看成d,得到d*b/c
  2. 把d*b看成e,得到e/c
  3. 得到ec/
  4. 展开e为db,得到db,推出db*c/
  5. 展开d为a-b,得到ab-,推出ab-b*c/

技巧:按中缀表达式来看,越重要的计算,在后缀表达式中越迟计算,从中缀表达式中,最后计算的步骤开始。

四、中缀表达式转后缀表达式算法描述

算法描述:

1 创建一个栈,用于临时存放操作符

2 遍历中缀表达式src的每一项 item

(1) 若该项是操作数,则直接放到dst后缀表达式

(2) 若该项是操作符 op

  • 如果op是左括号,则直接放在栈里

  • 如果op是右括号,则从栈里弹出操作符,一直到匹配的左括号。把所有弹出的操作符依次放到dst里。

  • 如果op是普通操作符,则从栈里弹出操作符,一直到比自己优先级小的符号。

把弹出的操作符放到dst里,然后把该项放到栈里。

3 全部处理完成后,把栈里的剩下的操作符弹出来,放到dst里

注意:这些算法不用背,理解并且能像第三板块里手写出来就可以,最多半个月这些算法你就会忘,用到的时候来看看算法描述就行。

你可能感兴趣的:(数据结构)