数据结构与算法-栈(逆波兰表达式)

小孱弱弱又来发帖了,今天带来的知识点是逆波兰表达式,相信学过栈的小盆友们都接触过这个极其不符合正常人思维的表达式,但是作为栈的重要应用,逆波兰表达式的地位那是相当的高,先让我们了解一下逆波兰表达式的历史。逆波兰表达式
其实我们使用的计算器,都是采用这一原理,原因是机器思维无法理解括号的强制优先级课控制。多亏了波兰的女逻辑学家家哈哈哈,为什么没用发明者的名字命名的,她的名字太复杂了,看来想名流千古哦名字需要朗朗上口才行啊哈哈哈,打住!
我们平常使用的运算式叫做中缀表达式,而后缀(逆波兰)表达式(RPN),他们可以通过一定的算法相互转换,我们先了解一下它的工作原理:
例如:9+(3-1)*3+10/2;这是我们所熟悉中缀表达式,它的逆波兰表达式是:9 3 1- 3 * + 10 2 / +;
这一串表达式呀,完全反人类啊,但是吧,我们人类不喜欢,机器确实很喜欢;
来了来了:

规律::从左到右遍历表达式,遇到数字就进栈,遇到运算符就将栈顶两个数字出栈,配合运算符运算,运算结果入栈,~~直到栈只剩下一个数字,这就是表达式的结果了,完美出栈,华丽完成任务!

1.初始化一个空栈,按规律来,数字9 3 1入栈,遇到符号-,停下,取出栈顶两个元素和符号运算,3-1得到2,然后2入栈。
2.数字3入栈,遇到运算符*,栈顶两元素出栈运算2*3得6,6入栈。
3.遇到运算符+,栈顶元素出栈运算,6+9得到15,15入栈。
4.数字10 2入栈,遇到运算符/,10 2出栈做运算,10/2得到5,5入栈。
5.遇到+,栈顶做运算,15+5=20,20入栈。
栈中只剩下20了,这个后缀表达式得结果就是20!!!!

这对机器来说轻而易举,但是又面临了一个问题:逆波兰表达式怎么得出来的?这是个问题!哈哈哈。下面我们看看我们熟悉的中缀表达式怎么化简为后缀表达式。

这个转换过程依然要用到我们得重量级数据结构—栈。
规律:
这次我们使用两个栈分别存储运算符和表达式,方便来说,我们管表达式栈叫A,管符号栈叫B。分别入栈,我们关注的主要是符号栈B。比较运算符优先级,对于括号,分左缀和后缀,只有左缀和右缀同时对应时,同时出B栈,并且括号里的运算符一同出栈B。无括号是,一个一个的符号进栈B时,和B栈顶元素比较优先级,比栈顶优先级高入栈B,反之,出栈B,入栈A。直到全部进入栈A,栈A中的就是我们可爱的逆波兰表达式了

表达式:9+(3-1)3+10/2
1.数字9进入栈A,符号+进入栈B,符号(入栈B,数字3入栈A,符号-入栈B,数字1入栈A,符号)入栈B。
2.括号左缀和右缀相遇,从左缀开始到栈顶全部出栈B,左右抵消,括号消失,原本在括号中间的符号-入栈A。
3.符号
入栈B,由于原先栈顶的+优先级比*低,继续~,数字3入栈A,符号+入栈B,由于原先栈顶符号 *,要比+要高,符号 * +出栈B,符号 * +入栈A。
4. 数字10进栈A,符号/入栈B,因为符号/优先级比栈顶的+要高,继续~ ,数字2入栈A。
5. 最后把符号栈B的元素转移到栈A中就可以了,B栈顶符号/进入栈A,B栈顶符号+进入栈A。
6. 栈A中的就是我们的逆波兰表达式啦!!

最后加上一些个人的感想:我们的处于信息化的时代,计算机可能运算速度是人脑的几万倍,但计算机本来就是人类智慧的结晶。我们不断地学习伟大前辈们的的知识果实,不是它能干什么伟大惊天动地的事,它是一种思想,一种开阔眼界的思想,当你从中领会到什么,那是无比的荣幸,因为那是前辈们成千上万次努力的结果。正如我们所说的逆波兰表达式,这个发现无疑事伟大的,它让计算机由原来中只能运算单独的加减乘除,扩展到了复杂的混合运算,其实我们的计算器的工作原理,无不再此,每一个伟大的发明的背后满是艰辛和痛苦,但是你坚持的动力不就是让自己变得更加强大吗?

猜你喜欢

转载自blog.csdn.net/weixin_47644373/article/details/106067988