数据结构与算法(2)栈

阅读极客时间的《数据结构与算法之美》总结

栈的基本定义

栈就是满足先进后出、后进先出的数据结构,其具体实现多种多样,有使用链表来构成的链式栈,也有使用数组构成的顺序栈。使用其他数据结构来进行封装,就是为了屏蔽因数组或链表操作的灵活性而可能带来的无意间出错,向外只提供出栈、入栈操作,这样能够简化对其使用的逻辑。

栈的应用

现实中有很多应用,文章中指出了有意思的四种,浏览器的向前向后操作、优先级不同的运算符运算、不同层级括号的合法性检验以及方法调用的栈帧。

浏览器向前向后操作

浏览器通过设置两个栈,一个为后退栈,一个为前进栈,当从A网页点击了B网页,那么就把A网页先入后退栈,B网页入后退栈,从B网页点击进入C网页,那么就把C网页入后退栈,这样后退栈中从栈底到栈顶的顺序为A->B->C,当从C网页后退到B网页时,那么就把C网页出后退栈,并入前进栈,之后再从B网页后退时,把B网页出后退栈,入前进栈,此时前进栈从栈底到栈顶的顺序为C->B,如果此时从A网页向前进入B网页时,再把B网页出前进栈,入后退栈即可,如果此时从B网页进入D网页,那么把D网页入后退栈,并把前进栈清空。

优先级不同的运算符运算

设置两个栈,一个用于存放操作数,另一个存放操作符号。比如我们计算1+2*3-4的时候,遇到数字时放到操作数栈,遇到操作符先于操作符栈的栈顶元素比较,若优先级低于或等于栈顶操作符,那么就弹出两个数字,并把栈顶操作符号出栈并运算,将运算结果存入操作数栈中;若优先级高于栈顶元素,那么就将符号放入操作符栈中。
下图是计算到减号时的情况

1
2
3
+
*

此时减号比操作符栈顶的乘号优先级低,那么出栈操作数栈的32,然后出栈操作符栈的乘号,运算后将计算结果放入操作数栈:

1
6
+

这时候再比较减号和加号,发现优先级相同,那么再弹出两个操作数61,然后弹出操作符加号,运算后将结果存入操作数栈中:

7

如图所示,这时候减号入栈,之后再把4入栈,这时候已经没有数字或者符号要入栈了,逐步弹出操作数和符号进行运算:

4
7
-

结果为3

不同层级的合法性检验

比如有三种括号,(),[],{},规则是同层级要左括号与右括号相对应,括号可以相互嵌套,比如{[()]},但是这样是不可以的{(}])[,这时候我们用一个栈保存未匹配的左括号,当遇到右括号的时候就与左括号栈的栈顶元素比较,若相互匹配即(),[],{},那么就任务是正确的,并将栈顶元素出栈,如果不匹配那么就是错误的。

方法调用

方法调用的时候会把这个方法的参数变量、临时变量等等封装入栈帧中,当调用时就把这个栈帧放入栈中,比如A方法调用B方法,B方法调用C方法,那么就依次把A、B、C方法放入栈中:

A
B
C

当C方法执行完后进行出栈,那么就执行B方法就可以了,B方法执行完毕出栈后执行A方法就可以了。

猜你喜欢

转载自blog.csdn.net/ws948342046/article/details/87710645
今日推荐