首页 > 其他分享 >数据结构之【栈】

数据结构之【栈】

时间:2024-01-10 23:01:31浏览次数:27  
标签:出栈 入栈 元素 栈顶 链式 操作 数据结构

栈和队列是线性表的两个经典特例,它们都是操作受限的线性表,即操作位置需要满足各自的条件,因为这些条件的特殊性,使得实现各自的操作时过程简捷,效率更高。这两个数据结构的应用也非常广泛。

自助餐厅里的一摞盘子就是常见的栈的例子。在栈中,只能在栈顶位置添加或删除数据项。排队是日常生活中常见的场景。人正在排队的队伍就是队列,如服务窗口前的等待服务的一排顾客就构成了一个队列。在队列中,数据项在一端进入,在另一端离开。


定义:栈(stack)是限定仅在一端进行插入和删除的线性表。能进行插入和删除的这一端称为栈顶(top),而另一端称为栈底(bottom)。


在栈顶插入一个元素称为入栈(push),进栈或压栈,从栈顶删除一个元素称为出栈(pop)或退栈。

数据结构之【栈】_数据结构

注意:入栈和出栈操作只能在栈顶进行,实际上,只能看到栈顶元素,栈顶之下的所有元素都是不可见的,对非栈顶元素的任何访问都是不允许的。

特性:后进先出

栈的存储及实现

和线性表一样,栈也有两种主要的存储方式,分别是顺序存储和链式存储。顺序存储方式使用数组保存栈元素,得到的是顺序栈。链式存储方法使用单链表保存栈元素,得到的是链式栈。

顺序栈

在顺序栈中,栈中的元素保存在一维数组中,将栈底定义在数组下标为0的位置。还有一个变量标记栈顶位置。栈顶位置也称栈顶指针,不过它只是数组中的一个下标,并不是真正意义上的指针。

栈顶位置top具体指向数组中的那个位置呢?

它有两种不同的定义方式:一种是定义在紧邻栈顶元素的下一个空位置,另一种是定义在栈顶元素所在的位置。

数据结构之【栈】_数据结构_02

时间复杂度:栈的入栈操作及出栈操作都在栈顶进行,所以入栈及出栈时都不需要移动栈中已有的元素,避免了顺序表中插入及删除操作时的数据移动。所以顺序栈入栈和出栈操作的时间复杂度都是O(1),判定栈空及栈满等操作的时间复杂度都是O(1)。

链式栈

链式栈可以看做是一个仅在表头位置进行操作的单链表。将头指针所指的这一端作为栈顶,表尾一端作为栈底。入栈操作及出栈操作都可以通过头指针完成。在链式栈中,可以只定义头指针,尾指针和头结点都可以不定义。

时间复杂度:与顺序栈一样入栈和出栈操作的时间复杂度都是O(1)


顺序栈与链式栈的比较
  1. 顺序栈需要预先申请一个固定长度的一维数组,并且自始至终全部占用,当栈中元素较少时,空间浪费较大。
  2. 链式栈长度可变,但是每个元素都需要一个指针域,这又产生了结构型开销。
  3. 两种实现方式没有本质区别,如果不能预先估算出栈中元素最大个数时,只能使用链式栈,而如果知道最大元素个数则可以使用顺序栈。
  4. 如果栈中入栈,出栈操作比较频繁,则采用链式栈时,会频繁得调用系统函数,申请、释放结点所占用的空间。若每个节点占用的空间较小,则多次申请、释放空间会导致内存中出现很多碎片。



标签:出栈,入栈,元素,栈顶,链式,操作,数据结构
From: https://blog.51cto.com/AmbitionGarden/9187008

相关文章

  • 蓝凌OA 人事档案数据结构
    模块:人事档案薪酬福利表名称:hr_staff_emolument_welfare对象名称:com.landray.kmss.hr.staff.model.HrStaffEmolumentWelfare列名描述非空长度类型fd_idIDtrue Stringfd_payroll_name工资账户名true50Stringfd_payroll_bank工资银行false100......
  • 【字典树/trie树】实现高效插入和查询字符串的数据结构
    本文是https://www.acwing.com/problem/content/description/837/的总结,有兴趣可以做做字典树的实现依赖于树结构,有两种操作,1是插入字符串,2是查找字符串。使用idx维护最新的结点下标。如下图,假设我们维护一个 可以看到,我们维护了一个树形结构储存了左边的字符串,但......
  • 【数据结构】栈的基本知识详解
    栈的基本概念与基本操作导言大家好,很高兴又和大家见面了!!!今天开始,咱们将正式进入【数据结构】第三章的内容介绍。在第三章的内容中,我们需要掌握栈和队列的操作及其特征,以及数组与特殊矩阵的压缩存储等知识点。为了更好的掌握这些知识点,我们将对这些知识点进行一一介绍。今天要介绍......
  • 数据结构线性表之【循环链表、双向链表】
    循环链表在单链表中,每个结点都带有一个指向其后继结点的指针,但因为表尾元素没有后继结点,所以表尾结点的指针域为空,表明它不指向任何结点,并表示这个结点是最后一个结点。现在修改这个约定,将表尾结点的指针指回头结点,从而形成一类新链表。在这样的链表中,从任何一个结点出发并沿着指针......
  • 数据结构【树篇】(二)
    数据结构【树篇】(二)文章目录数据结构【树篇】(二)前言为什么突然想学算法了?为什么选择码蹄集作为刷题软件?目录树(一)、树的存储(二)、树和森林的遍历——并查集(三)、并查集的优化结语前言为什么突然想学算法了?>用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重......
  • 算法与数据结构(开篇)
    基本概念:算法(Algorithm):⼀个计算过程,解决问题的⽅法NiklausWirth:“程序=数据结构+算法”时间复杂度时间复杂度:⽤来评估算法运⾏效率的⼀个式⼦经验当算法过程出现循环折半的时候,复杂度式⼦中会出现logn.时间复杂度是⽤来估计算法运⾏时间的⼀个式⼦(单位)常⻅的时间复杂度(按效率排......
  • 严蔚敏《数据结构》存储结构
    目录1.单链表2.双向链表3.带头结点的链表4.顺序栈5.单链队列6.循环队列7.广义表头尾链表存储8.广义表的扩展线性链表存储9.二叉树二叉链表存储表示10.树的双亲表示法11.树的孩子链表存储表示(孩子表示法)12.树的孩子兄弟表示法(二叉树表示法)13.二叉树的二叉线索存储......
  • 数据结构——顺序线性表(向量)
    参考文章:数据结构(顺序表——线性表)_创建顺序线性表sl,调用initlist()函数对sl初始化-CSDN博客以下是作为个人笔记,自己学习用。线性表是具有相同特性的数据元素的一个有限序列,在线性表中每个数据元素由逻辑序号唯一确定。线性表的特性:1.有穷性:表中元素个数是有限的。2.一致性:表中所......
  • 数据结构【线性表之单链表】
    链表链表:线性表还可以使用链式存储方式保存,即线性表中的各个元素保存在各自的存储空间中,形成一个个节点。这些结点在内存的地址不要求是相邻的,它们之间通过指针连接起来。特点:灵活存储,不要求预先分配一块连续的空间,而是按需分配,随时需要,随时分配不要求分配的空间必须是相邻的没有......
  • 数据结构线性表之顺序表
    定义:一个线性表是由同类型数据元素构成的有限序列一般地,当表示一个由n(n>=0)个元素组成的线性表L时,将线性表中的所有元素列在一对括号中,每个元素之间以逗号分隔,如L=(a0,a1,....,an-1)不搞的像数据那么麻烦了,按我理解的来表项:线性表中的数据元素表头元素:线性表的第一个元素表尾元素:......