逆波兰表达式简介
各位观众大大好久不见咯
,好久木有上来打理自己的博客了,最近开始期末考试了,而小达也好久都没去上过课了,所以你们懂的,出来混的总是要还的哈。想写关于逆波兰表达式的东西好久了,一直都没抽出时间来(其实就是懒
)废话不多说,就是干,今天小达给大家带来了自己学习逆波兰表达式的看法。在讲你波兰表达式时会结合一个简易计算器的开发一起讲,将逆波兰表达式直接运用于实践中,应该更好理解吧。


我们先来看看什么是逆波兰表达式,其实我也背不下定义,我们来看看是怎么个情况哈,逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。
这种东西到底有什么好处呢?下面两个式子计算结果应该是一样的,只是表达的方式不同。
<span style="font-size:14px;"> 正常的表达式(中缀表达式): a + d * ( b - c )</span>
<span style="font-size:14px;"> 逆波兰表达式(后缀表达式): a , d , b , c , - , * , + (中间的逗号不要管)</span>
我们一般写的算术表达式就是所谓的中缀表达式,让人来计算中缀表达式可能很简单,但是计算机就不行了,为了让计算机也能快速的计算,我们需要将中缀表达式转换为后缀表达式,在后缀表达式中,可以通过运算符的优先级和摆放的次序来代替中缀表达式的括号,而在计算的时候也只需要从符号堆栈和数字堆栈中进行存取和计算就能达到目的。
我们以下面这个中缀表达式为例子,手动一步一步的将它转化为后缀表达式。先建立一个堆栈来存储运算符。有人说堆栈是什么,请看这里。
<span style="font-size:14px;"> 9 * ( 3 - 2 / 1 ) + 1</span>
1. 正式的开始转化,首先第一个规则就是,遇到数字直接加入到后缀表达式中。(比如第一个数字 9 直接写出)
2. 第二个规则是碰到运算符,需要做不同的处理。
① 若当前符号堆栈为空,则直接入栈。
② 若是 ‘(’ 就直接将其压入栈中,不管符号堆栈是否为空,也是直接入栈。
③ 若当前符号栈中已经有元素了,则弹出栈顶符号,和遇到的那个符号比较运算优先级(不算括号)。
Ⅰ.弹出的运算符优先级大,则将弹出的运算符写入后缀表达式,再重复步骤③
Ⅱ.弹出的运算符优先级小或者等于,则将弹出的运算符压入栈中,再将遇到的运算符也压入栈中。
Ⅲ.弹出的运算符为‘ ( ’,则先压入 ‘(’,再压入遇到的那个符号
④ 若碰到了‘ )’,则不停的从符号栈中弹出运算符至后缀表达式中,直到遇到第一个与之匹配的‘(’为止。这个过 程将中缀表达式中的括号直接去除,这也是后缀表达式的优势。
3. 按照前两个规则不停的读取中缀表达式的每个字符,直到中缀表达式读取完毕,最后再将符号栈中的运算符依次弹出到后 缀表达式中,这个时候如果符号栈中还存在单个的括号,就说明刚才的中缀表达式括号匹配出现了问题。如果没有,那么 恭喜,
,转化成功。

按照上面的规则,我们来一步步转化刚开始的例子。后缀表达式会用红色标出,符号栈用蓝色标出,左边栈底,右边栈顶。
先遇到了表达式中的数字 ‘9’,将其写入后缀表达式中。 后缀表达式 9
往后看,遇到了 ‘ * ’乘法运算符 , 依据上述规则中的 2-①,直接压入符号栈。 符号栈 * 后缀表达式 9
压入栈后,遇到了 ‘( ’,依据规则 2-②,直接入栈。符号栈 *,( 后缀表达式 9
后遇到了 数字 ‘ 3 ’,直接入栈。 符号栈 *,( 后缀表达式 9,3
再遇到了符号 ‘ - ’,依据规则2-③-Ⅲ,压入栈中。 符号栈 *,( ,- 后缀表达式 9,3
往后面看遇到了数字 ‘ 2 ’,直接写入后缀表达式, 符号栈 *,( ,- 后缀表达式 9,3 ,2
遇到运算符 ‘ / ',根据规则③-Ⅱ,从栈顶取出的运算符是 ‘ - ’,优先级小,则将 ‘ - ’ 压入栈中,再将 ‘ / ' 压入栈中。
符号栈 *,( ,- ,/ 后缀表达式 9,3 ,2
遇到数字 ‘ 1 ’,直接写入后缀表达式中。 符号栈 *,( ,- ,/ 后缀表达式 9,3 ,2 ,1
接下来遇到了一个 ‘ )’,按照规则 2-④,不停的将运算符弹出到后缀表达式中,直到遇见第一个 ‘ (’。
符号栈 * 后缀表达式 9,3 ,2 ,1,/ , -
上面的步骤去掉了一对括号,但是运算的顺序不会改变。再遇到了一个 ‘ - ’ , 根据规则 2-③-Ⅰ,将 ‘ * ’弹出到后缀表达式 中,由于弹出后符号栈没有元素了,就将 ‘ - ’ 入栈。
符号栈 - 后缀表达式 9,3 ,2 ,1,/ , - ,*
在最后一个 数字 ‘ 1 ’,直接写入后缀表达式中,到这里为止中缀表达式读取完毕了,然后根据规则 3 , 弹出符号栈中的所 有元素,符号栈为空, 后缀表达式 9,3 ,2 ,1,/ , - ,* ,1,-
转化完成,后缀表达式 9,3 ,2 ,1,/ , - ,* ,1,- 小达又复习了一遍,讲的应该够清楚了吧,一个一个字码上去的,有点累哈,
,还有什么不懂得可以给我留言,在下一篇博客中,会讲到如何来计算后缀表达式。今天就到这里咯,各位再见~~~
