1、什么是栈?
- 后进先出,先进后出,这就是典型的“栈”结构。
- 从栈的操做特性来看,是一种“操做受限”的线性表,只容许在一端进行操做,好比插入和删除数据。
2、为何须要栈?
- 栈是一种操做受限的数据结构,其操做特性用数组和链表都可实现。
- 可是,任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎全部的操做,不免会引起错误操做的风险。
- 因此,当某个数据集合只涉及在某一端插入和删除数据,且知足后进者先出,先进者后出的操做特性时,咱们应该首选栈这种数据结构。
3、如何实现栈?
1. 栈既能够用数组来实现,也能够用链表来实现。用数组实现的栈,咱们叫做顺序栈,用链表实现的栈,咱们叫做链式栈。
2.数组实现(自动扩容)
- 时间复杂度分析:根据均摊复杂度的定义,能够得数组实现(自动扩容)符合大多数状况是O(1)级别复杂度,个别状况是O(n)级别复杂度,好比自动扩容时,会进行完整数据的拷贝。
- 空间复杂度分析:在入栈和出栈的过程当中,只须要一两个临时变量存储空间,因此O(1)级别。咱们说空间复杂度的时候,是指除了本来的数据存储空间外,算法运行还须要额外的存储空间。
- 摊还复杂度分析:在涉及扩容的那次入栈操做(即第N+1次入栈),须要将N个数据进行迁移,可是N+1次操做触发一次数据迁移,将N个数据迁移平摊到N+1次操做,复杂度为O(1)
3.链表实现
- 时间复杂度分析:压栈和弹栈的时间复杂度均为O(1)级别,由于只需更改单个节点的索引便可。
- 空间复杂度分析:在入栈和出栈的过程当中,只须要一两个临时变量存储空间,因此O(1)级别。咱们说空间复杂度的时候,是指除了本来的数据存储空间外,算法运行还须要额外的存储空间。
四. 解答开篇
经过两个栈实现浏览器获得前进后退功能。算法
一个栈X,一个栈Y。数组
每次跳转到新页面时将此页面压入X,并清空Y;当点击后退按钮式时,将X出栈,并压入到Y;当点击前进按钮时,将Y出栈,压入X。浏览器
X为空时表示没有页面能够后退浏览了,当Y为空时表示没有页面能够前进浏览了。数据结构