- 01.什么是栈
- 02.栈的使用场景
- 03.常见操作
- 04.异常
- 05.栈的效率
- 06.栈的常见算法题
- 什么是栈
- 是一端受限,一端允许进行操作的线性表。即:先放的后取,后放的先取。就是通常说的“先进后出”(FILO)。存储结构最常见的有两种:一种是顺序存储,一种是链式存储。其中顺序存储就是之前讲的数组,链式存储就是之前讲的链表。
- 比如,在Android开发中,使用的栈就是一种顺序存储,下面我会分析到的。
- 如何理解“栈”?
- 关于“栈”,我有一个非常贴切的例子,就是一摞叠在一起的盘子。我们平时放盘子的时候,都是从下往上一个一个放;取的时候,我们也是从上往下一个一个地依次取,不能从中间任意抽出。后进者先出,先进者后出,这就是典型的“栈”结构。
- 第一次接触这种数据结构的时候,就对它存在的意义产生了很大的疑惑。因为我觉得,相比数组和链表,栈带给我的只有限制,并没有任何优势。那我直接使用数组或者链表不就好了吗?为什么还要用这个“操作受限”的“栈”呢?
- 事实上,从功能上来说,数组或链表确实可以替代栈,但你要知道,特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。
- 当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。
- 比如,浏览网页中已经访问页面的历史纪录(后退)
- 文档编辑器中的撤销序列
- Android中activity的栈管理,fragment的栈管理
- 主要操作
- 辅助操作
- isEmpty,top,size,isStackFull
- 注意要点
- top,只需要读取栈顶元素的值,而不移除它,这个数据没有出栈,而且只能查看栈顶元素。
- 操作解释
- 初始化:通常是一个构造器,用于创建一个空栈
- 返回栈的长度:该方法用于返回栈中数据元素的个数
- 入栈:向栈的栈顶插入一个数据元素,栈的长度+1
- 出栈:从栈的栈顶删除一个数据元素,栈的长度-1,该方法通常饭后被删除的元素
- 访问栈顶元素:返回栈顶的数据元素,但不删除栈顶元素
- 判断栈是否为空:改方法判断栈是否为空,如果栈为空则返回true,否则返回false.
- 清空栈:将栈清空
- 入栈:如果栈满了,还想继续插入数据,就会报错,理论上,ADT定义的栈是不会满的,但数组实现的栈会满。
- 出栈:栈空时,还想弹出一个数据项,就会报错。
- 数据项入栈和出栈的时间复杂度都为常数O(1),即栈操作所耗费的时间不依赖于栈中数据项的 个数,因此操作时间很短。栈不需要比较和移动操作。
- 创建一个空栈
- 压入
- 返回栈顶元素
- 弹出
- 打印栈内元素
- 获得栈中最小元素
- 将栈内元素反向
- 判断出栈顺序是否正确
- 利用两个栈实现队列
- github:https://github.com/yangchong211
- 知乎:https://www.zhihu.com/people/yczbj/activities
- 简书:http://www.jianshu.com/u/b7b2c6ed9284
- csdn:http://my.csdn.net/m0_37700275
- 喜马拉雅听书:http://www.ximalaya.com/zhubo/71989305/
- 开源中国:https://my.oschina.net/zbj1618/blog
- 泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1
- 邮箱:yangchong211@163.com
- 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV
- segmentfault头条:https://segmentfault.com/u/xiangjianyu/articles
- 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e