一、前言
- 刚好公司业务需要,需要分析一个语法表达式转成一个业务需要的结果
- 所以接触到
逆波兰表达式
。刚好可以满足我想要的结果。
二、逆波兰表达式
- 逆波兰表达式又叫做后缀表达式,跟 波兰表达式(前缀表达式)相对应
- 波兰逻辑学家
J・卢卡西维兹(J・ Lukasiewicz)
于1929年首先提出的一种表达式的表示方法 。 - 我们习惯将表达式写成
( 1 + 2 ) * ( 3 + 4)
,加减乘除等运算符写在中间,因此称呼为 中缀表达式。 - 而波兰表达式的写法为
(* (+ 1 2) (+ 3 4))
,将运算符写在前面,因而也称为前缀表达式。 - 逆波兰表达式的写法为
((1 2 +) (3 4 +) *)
,将运算符写在后面,因而也称为后缀表达式。 - 波兰表达式和逆波兰表达式有个好处,就算将圆括号去掉也没有歧义。
三、表达式的原理
- 看了简单的概念,还是云里雾里,管它什么表达式呢,到底怎么计算的?
- 主要用到了
栈
结构,我们怎么把中缀表达式转成计算器更容易处理的后缀表达式呢?
1、转换流程
- 1、把字符串从左到右遍历解析成每项是
数字
或者运算符
放到同一个List中 - 2、然后初始化2个栈,一个是数字栈,一个是符号栈
- 3、遍历第一步生成的List
- 如果是数字,直接放入到 数字栈中
- 如果是左括号,直接放入到 符号栈中
- 如果是右括号,就需要把和它对应的左括号中间的所有符号,从符号栈出栈放到数字栈中
- 其中,右括号和左括号不入数字栈,直接舍弃
- 如果是符号
- 如果当前符号栈为空或比符号栈顶的符号优先级高则直接入符号栈
- 如果优先级小于等于符号栈顶则把栈顶的符号取出放到数字栈
- 重复上面的操作,直到栈顶符号优先级小于它,把它放入符号栈中
- 4、当遍历结束之后,遍历符号栈数据,把它们取出放到数字栈中
- 5、最终数字栈的数据就是我们想得到的后缀表达式顺序了。
四、代码实现
- 其实看那么多文字,还不如看代码理解得快
|
- 运行结果如下:
拆分成项:[(, 1, +, 2, ), *, (, 3, +, 4, )] |
- 这个代码其实就相当与一个计算器了。