一.栈(Stack)

栈是一种用于存储数据的简单数据结构(与链表类似) , 栈的关键就是入栈的次序 , 比如我们在交作业的时候 , 最先交的永远都在最后面 , 而老师检查的时候是从最上面开始拿 , 所以第一个交的作业老师最后一个看完

栈是一个有序的线性表 , 只能在表的一端(称为栈顶 , top)执行插入和删除操作 , 最后插入的元素将被第一个删除 , 所以栈也被称为后进先出(Last In First Out : LIFO)或者是先进后出(First In Last Out : FILO)线性表

两个改变栈操作都有专用名称 , 一个称为入栈(push) , 表示在栈中插入一个元素 , 一个称为出栈(pop) , 表示从栈中删除一个元素 , 在对一个空栈执行出栈操作时被称为下溢(underflow) , 相反 , 对一个满栈执行入栈操作时被称为溢出(overflow) , 通常 , 下溢和溢出均认为是异常, 下图是一个栈的例子

1.栈的实现方式

  • 基于简单数组实现

  • 基于动态数组实现

  • 基于链表实现

1.1 基于数组实现

如下图所示 , 从左到右向数组中添加所有元素 , 并定义一个变量来记录栈顶的位置(栈顶在任意一端都可以 , 也就是在数组的尾部或者头部都可以)

当数组存满元素时 , 执行入栈操作将抛出栈满异常 , 当对一个没有存储栈元素的数组执行出栈(删除元素)操作时 , 将抛出栈空异常

时间复杂度分析

  • 如果使用表头作为栈顶 : 入栈操作(push())时间复杂度为O(1)出栈操作(pop())时间复杂度为O(1)

  • 如果使用表尾作为栈顶 : 入栈操作(push())和出栈操作(pop())时间复杂度为O(1)

  • 删除栈的时间复杂度 : O(1)

局限性

栈的最大空间必须预先声明 , 试图对一个满栈执行插入操作将产生一个针对简单数组这种特定实现栈方式的异常

1.2 基于动态数组实现

基于数组的实现方式存在的问题就是在固定大小的数组中 . 如何处理所有空间都已经保存了栈元素这种情况

  • 数组 . 动态数组 , 链表 , 双向链表 , 循环结构 : 数据结构之顺序存储结构和链式存储结构分析 , 图文并茂 , 又涨姿势了

  • ArrayList底层也是使用动态数组实现 : java框架集合List子接口之ArrayList源码剖析

解决方法1

当栈满时 , 每次将数组的大小增加 1

弊端

这种做法会导致开销太大 , 当栈满后 , 新建一个长度为旧数组长度 + 1的数组 , 然后把旧数组的值拷贝到新数组 , 在新数组添加末尾元素 , 不管是从空间复杂度的角度还是时间复杂度来说每次都需要新建数组 , 拷贝元素 , 开销都是比较大的

解决方法2

我们可以使用和数组倍增来解决方法1的频繁扩容问题 , 当栈满时 , 我们可以新建一个旧数组大小长度1倍的新数组 , 然后拷贝元素

弊端

倍增太多可能导致内存溢出

时间复杂度分析

  • 如果使用表头作为栈顶 : 入栈操作(push())为O(N)出栈操作(pop())时间复杂度为O(1)

  • 如果使用表尾作为栈顶 : 出栈操作(pop())时间复杂度为O(1) , 入栈操作(push())如果不考虑扩容的情况下为O(1) , 如果考虑扩容的情况为O(N)

  • 删除栈的时间复杂度 : O(1)

1.3 基于链表实现

使用链表也可以实现栈 , 通过在表头/表尾添加元素实现入栈操作 . 通过删除表头/表尾节点(栈顶)来实现出栈操作

时间复杂度分析

  • 如果链表的表头为栈顶 : 入栈操作和出栈操作时间复杂度为O(1)

  • 如果链表的表尾为栈顶 : 入栈时间复杂度 : O(N) , 出栈时间复杂度O(1)

  • 删除栈时间复杂度 : O(N)

1.4 栈的各种实现方式比较

递增策略和倍增策略

  • 递增策略 : 实现push()操作的时间复杂度平均为O(N)

  • 倍增策略 : 实现push()操作的时间复杂度平均为O(1)

基于数组实现的栈和基于链表实现的栈

基于数组实现 :

  • 各个操作都是常数时间开销

  • 每隔一段时间倍增操作的开销较大

  • n个操作的的任意序列平均复杂为O(N)

基于链表实现 :

  • 栈规模的增加和减少都很简洁

  • 各个操作都是常数的开销

  • 每个操作都需要额外的时间和空间来处理指针

线性数据结构之栈(Stack)相关推荐

  1. Python数据结构实战—栈(Stack)

    文章目录 1.栈的性质(后进先出) 2.使用deque作为栈 3.使用双端队列实现Stack类 1.栈的性质(后进先出) s = [] #定义一个空数组装元素 s.append('https://ww ...

  2. C++ 数据结构之栈stack (henu.hjy)

    首先栈是一个先进后出或者说后进先出的限制性数据结构,并且用代码实现有顺序表和线性表两种方式,我的代码采用了顺序结构存储的方式,即首先在内存中申请一块空间,通过top和base两指针的状态进行基本增删改 ...

  3. 线性数据结构之队列(Queue)

    一.队列(Queue) 队列是一种用来存储数据的数据结构 , 与链表和栈类似 , 数据到达的次序是队列的关键 , 类似于生活中我们在排队购买东西时 , 第一个人是队首 , 最后一个人是队尾 , 第一个 ...

  4. 数据结构:线性数据结构(1)-栈(栈,队列,deques, 列表)

    栈,队列,deques, 列表是一类容器,他们数据项之间的顺序由添加或删除的顺序决定,一旦一个数据项被添加,它相对于前后元素一直保持该位置不变.注入此类的数据结构称为线性数据结构. 栈 栈(栈,队列, ...

  5. 数据结构:线性数据结构(3)-deques(栈,队列,deques, 列表)

    deque(也称为双端队列)是与队列类似的项的有序集合.即使 deque 可以拥有栈和队列的许多特性,它不需要由那些数据结构强制的 LIFO 和 FIFO 排序.这取决于你如何持续添加和删除操作. 1 ...

  6. 数据结构:线性数据结构(2)-队列(栈,队列,deques, 列表)

    队列:FIFO 1.队列的抽象数据类型 队列抽象数据类型由以下结构和操作定义.如上所述,队列被构造为在队尾添加项的有序集合,并且从队首移除.队列保持 FIFO 排序属性.队列操作如下: Queue() ...

  7. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  8. 数据结构:栈(Stack)

    数据结构:栈(Stack) 栈是一种数据结构,是一种只能在一端进行添加和删除,受限制的线性表.先进入的元素被压入栈顶,最后进入的元素在栈顶,又称LIFO(后进先出)线性表. 栈需要下面几种操作 入栈 ...

  9. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

最新文章

  1. elasticsearch和hadoop集成,gateway.type hdfs设置
  2. 干货丨一文读懂深度学习(附学习资源,据说点赞2W+)
  3. SQL SERVER while循环
  4. 9个必须时刻警惕的Linux命令代码
  5. 【算法分析与设计】实验 回溯算法解决0-1背包问题
  6. python 视频人脸替换_Python基于OpenCV实现视频的人脸检测
  7. gcc学习(一)[第二版]
  8. SpringMVC之RequestHeader注解与CookieValue注解详解
  9. 折线图_Pyecharts数据可视化分析—折线图
  10. C#:WebBrowser中伪造referer,为何对流量统计器无效?
  11. 数据库之DB2数据库备份
  12. C#实现的简单的随机抽号器
  13. 泛微服务器运维监控,泛微协同平台E-cology8后台维护手册-流程引擎(261页)-原创力文档...
  14. 【用html做个人简历的网页(初级)】
  15. 20 行代码编写一个简单的端口扫描器
  16. html十六进制和RGB颜色表
  17. 计算机爱恩斯坦棋游戏,爱恩斯坦棋计算机博弈系统的研究与实现
  18. [论文笔记]基于 CNN+双向LSTM 实现服饰搭配的生成
  19. JZOJ5996. 【WC2019模拟2019.1.12】回文后缀
  20. matlab绘图:将图导出在ppt上使用的三维矢量图

热门文章

  1. 关于RSA加密技术的使用,js前端加密,Golang 后端解密 详细
  2. 拆字程序c语言代码,单片机实验一拆字程序.doc
  3. chrome启动直接打开无痕窗口
  4. 从Hadoop框架讨论大数据生态
  5. 【校招内推】阿里巴巴飞猪客户端 2019届提前批次校招开始啦
  6. 【算法入门03】调整数组顺序使奇数位于偶数前面
  7. element-ui 表格树数据显示
  8. 浅析 Laravel 底层原理:契约(Contracts)
  9. 遇见a豆(adol):重新认识00后的生活态度
  10. G0第25章:Gin框架进阶项目实战