一.栈(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. Cisco PIX Syslog 配置说明
  2. 信息系统项目管理师考试时间安排
  3. pytorch 常用层(四)
  4. [洛谷P4174][NOI2006]最大获利
  5. c语言课程设计学生成绩簿,c语言课程设计—学生成绩管理系统
  6. (一)Nand FLASH 原理讲解
  7. HTML5活动目的,完美活动策划方案指南(教你做有意思的H5方案)
  8. 知识竞赛软件/答题系统/答题小程序
  9. 在Ubuntu 18.04上畅玩 Cataclysm: Dark Days Ahead:大灾变!
  10. CTF中遇到不知道文件类型_在营销界碰到网易,你永远不知道会遇到什么惊喜……...
  11. 传奇开服方法教程:传奇开服在哪些网站打广告?传奇发布站打广告技巧
  12. 微信小程序开发一个多少钱
  13. SAP MM 根据采购订单反查采购申请?
  14. C printf() 详解之终极无惑
  15. C语言——PAT 乙级(1002.读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。)
  16. 【小象学院】案例8——空气质量指数计算v7.0
  17. 修改数据库表字段长度
  18. 电脑网络重置后的出现的问题以及解决办法
  19. getPrepayId php,获取到 prepay_id 后将参数再次签名传输给 APP 发起支付
  20. charles安卓手机抓包

热门文章

  1. Leetcode-搜索-130.被围绕的区域(中等)
  2. 【Django学习笔记 - 16】:DRF概述、Web应用模式(前后端分离简介)
  3. 独热编码(One-Hot)及其代码
  4. centos7 网卡不见了
  5. python基础之面向对象1
  6. 对象导论之“是一个”与“像是一个”关系
  7. 1201-2019-算法-克鲁斯卡尔算法(最小生成树MST-Kruskal算法)
  8. 编程语言通用JsonResult,返回格式化json字符串,使用简单
  9. Java Volatile变量说明与测试
  10. Java使用正则表达式验证手机号和电话号码