一、表达式(中缀表达式)
中缀表达式就是我们常见的表达式,比如a+b。
二、波兰表达式(前缀表达式)
a+b在前缀表达式显示为:+ab。操作符在操作数的前面
三、逆波兰表达式(后缀表达式)
a+b在后缀表达式显示为:ab+。操作符在操作数后面。
再来复杂一点:a+b*c。转化为后缀表达式:
- 乘号的优先级高于加号,把b*c看成整体代号为d,得到a+d
- 已知a+b = ab+,所以a+d = ad+
- 展开d,bc = bc
- 最后完整的后缀表达式:abc*+
再来一道题更复杂的题:(a-b)*b/c,,转化为后缀表达式;
- 把(a-b)看成d,得到d*b/c
- 把d*b看成e,得到e/c
- 得到ec/
- 展开e为db,得到db,推出db*c/
- 展开d为a-b,得到ab-,推出ab-b*c/
技巧:按中缀表达式来看,越重要的计算,在后缀表达式中越迟计算,从中缀表达式中,最后计算的步骤开始。
四、中缀表达式转后缀表达式算法描述
算法描述:
1 创建一个栈,用于临时存放操作符
2 遍历中缀表达式src的每一项 item
(1) 若该项是操作数,则直接放到dst后缀表达式
(2) 若该项是操作符 op
如果op是左括号,则直接放在栈里
如果op是右括号,则从栈里弹出操作符,一直到匹配的左括号。把所有弹出的操作符依次放到dst里。
如果op是普通操作符,则从栈里弹出操作符,一直到比自己优先级小的符号。
把弹出的操作符放到dst里,然后把该项放到栈里。
3 全部处理完成后,把栈里的剩下的操作符弹出来,放到dst里
注意:这些算法不用背,理解并且能像第三板块里手写出来就可以,最多半个月这些算法你就会忘,用到的时候来看看算法描述就行。
版权声明:本文为qq_36890813原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。