数据结构与算法分析之逆波兰算法

何为逆波兰算法?逆波兰听上去真的很拗口应该是一名波兰数学家或者什么家发明的吧,还是叫它后缀表达式可能正常一点。我们常规的加减乘除可以叫中缀表达式,这种对数字的计算方式作为人类是非常容易理解的。但是往往人类能够轻易理解的,对于计算机而言却是一件十分痛苦的事情。毕竟计算机其实像个没有疲劳的傻孩子一样,你让他一直做什么它就会一直做什么,而且你还要手把手教这个孩子做事情才行(近年来人工智能貌似已经打破这个限制了)。进入正题

那么后缀表达式到底是什么?

中缀表达式: 1+5+6*5+3

对应的后缀表达式则是: 15+65*+3+

是不是觉得很难接受?对于很多考研没有工作经验的同学而言,其实直接学习数据结构和算法分析是一件比较痛苦的事情。后缀表达式为什么对计算机而言更加容易接受,那就是因为大多数数据存储都是使用的栈。而栈有个很明显的特点那就是LIFO,也就是后进先出。而且最重要的是栈的操作时间复杂度基本上都是常数。对于现代计算机而言更多是追求效率牺牲空间,由于硬件的急速发展空间存储已经完全能够满足。对于计算机而言,上述后缀表达式的操作过程如下

一、读取到1,非计算符号放到栈底

二、读取到5,非计算符号放到栈底

三、读取到+,是计算符号弹出栈底两个元素进行+操作后再放回栈底

四、读取到6,非计算符号放到栈底

五、读取到5,非计算符号到栈底

六、读取到*,是计算符号弹出该符号下两个元素,即5和6,进行该符号操作后放回栈底

七、读取到+,是计算符号弹出30和6,进行该操作

八、读取到3,非计算符号放到栈底。节省笔墨,两步一起说明。然后再读取到+,是计算符号,弹出该符号下两个元素进行该符号操作

最后一步没有下个元素读取,说明读取完毕,将栈底元素全部弹出输出。确保栈空。后缀表达式是不需要进行计算符号优先级考虑的。

想必应该已经对逆波兰算法有一定了解,留一个思考题。幂运算如何进行后缀表达式?

总结,逆波兰算法是对于计算机而言处理二元运算的一种非常巧妙的方式。理解一个中缀表达式到后缀表达式的转换过程,就会有一定程度的理解。

 

posted @ 2018-11-19 14:45  TroubleBoy丶  阅读(159)  评论(0编辑  收藏  举报