逆波兰式即后缀表达式,在搜索引擎及学术数据库中常常会使用“高级检索”的功能定义检索表达式,这种高级检索或专家检索需要将复杂的检索表达式转化为逆波兰式供计算机处理。逆波兰式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。

对于逆波兰式的转换来说,需要用到“栈”的数据结构,感兴趣的同学可以自己使用python或C完成程序编写,只需要用到条件判断和栈结构。本篇是介绍如何更加高效地完成逆波兰式的转换,方便大家理解复杂检索式的计算机处理过程。
考虑表达式 a ? b
这里的问号代表运算符,比如*、+这些,a ? b可以直接转换为?ab,对于计算机来说就是指,先输入做何种运算,然后输入需要的参数。
例如,a + b,就直接能转换为+ab。a * b,可以转换为*ab。比较特殊的是-运算符,因为-运算符只需要一个参数即可,例如,-a,那就是-a。那么结合括号的优先处理,再复杂的表达式都能够很简单高效的转换为逆波兰式。
例如:(-(a+b)*(c+d)+(e+f))*(g+h)
根据优先级,最外层的(-(a+b)*(c+d)+(e+f))可以看做一个整体,将其称为α,(g+h)可以看做另一个整体β,那么这个表达式可以看做是α*β,转换为*αβ。
进一步去拆解α,即(-(a+b)*(c+d)+(e+f)),按顺序其中(a+b)即+ab,-(a+b)即-+ab;然后(c+d)即+cd,-(a+b)*(c+d)即*-+ab+cd;(e+f)即+ef,最后整体就是+*-+ab+cd+ef,每一次运算基础单元后都将其视为一个整体。
进一步去拆解β,这部分比较简单,就是+gh。
那么最后就是*+*-+ab+cd+ef+gh。
再举个例子说明:(-(a+b*c)*(d*e+f))*(-(g+h)*(i*j)+k)
(-(a+b*c)*(d*e+f))*(-(g+h)*(i*j)+k)
这一部分可以转换为+a*bc,这里省略了一步,按理来说是两步,先转换后面的乘法,再执行加法。
(-(a+b*c)*(d*e+f))*(-(g+h)*(i*j)+k)
再考虑一下-号,最终这个部分就变成了-+a*bc。
(-(a+b*c)*(d*e+f))*(-(g+h)*(i*j)+k)
然后这个部分同理,转换为+*def。
(-(a+b*c)*(d*e+f))*(-(g+h)*(i*j)+k)
把上面的综合在一起,那就是*-+a*bc+*def。
(-(a+b*c)*(d*e+f))*(-(g+h)*(i*j)+k)
这部分就是-+gh。
(-(a+b*c)*(d*e+f))*(-(g+h)*(i*j)+k)
这部分转换为*ij。
(-(a+b*c)*(d*e+f))*(-(g+h)*(i*j)+k)
综上,这部分是*-+gh*ij。
再加上后面的+k就是,+*-+gh*ijk。
(-(a+b*c)*(d*e+f))*(-(g+h)*(i*j)+k)
最后,综上最外面的两个部分,整体就是
**-+a*bc+*def+*-+gh*ijk