当前位置: 首页 > news >正文

数据结构的概念大合集03(栈)

概念大合集03

  • 1、栈
    • 1.1 栈的定义和特点
    • 1.2 栈的基础操作
    • 1.3 栈的顺序存储
      • 1.3.1 顺序栈
      • 1.3.2 栈空,栈满,进栈,出栈的基本思想
      • 1.3.3 共享栈
        • 1.3.3.1 共享栈的4要素
    • 1.4 栈的链式存储
      • 1.4.1 链栈的实现
      • 1.4.2 链栈的4个要素

1、栈

1.1 栈的定义和特点

       栈是一种只能在一端进行插入或删除操作的线性表。在栈中,允许插入和删除操作的一端称为栈顶,另一端称为栈底。当栈为空时,称为空栈。栈的插入操作称为进栈或入栈,删除操作称为出栈退栈。

       栈的特点是“后进先出”,即后进栈的元素先出栈,英文表示为“last in first out,即LIFO

1.2 栈的基础操作

函数名函数作用
InitStack(&s)初识化线性表,构造一个空列表
DestroyStack(&s)销毁线性表,释放为线性表L分配的内存空间
StackEmpty(s)判断线性表是否为空表,若L为空表,则返回true,否则返回false
Push(&s,e)进栈,将元素e插入栈中作为栈顶元素
Pop(&s,&e)出栈,从栈s中删除栈顶元素,并将其赋值给e
GetTop(s,&e)取栈顶元素,返回当前的栈顶元素,并将其赋值给e。

1.3 栈的顺序存储

1.3.1 顺序栈

       同线性表一样,栈里面的元素也可以采用顺序存储结构,即分配一块连续的存储空间来存放栈中的元素,并用一个变量(例如top)指向当前的栈顶元素,以反映栈中元素的变化。这种采用顺序结构的栈称为顺序栈。
请添加图片描述

1.3.2 栈空,栈满,进栈,出栈的基本思想

  • 栈空:s->top == -1。
  • 栈满:s->top == MaxSize - 1 (data数组的最大下标)。
  • 进栈:先将栈顶指针top增1,然后将元素e放在栈顶指针处。
  • 出栈:现将栈顶指针top处元素取出放在e中,然后将栈顶指针减1.
    请添加图片描述

1.3.3 共享栈

       顺序栈的一种特殊表现形式,将两个类型相同的栈结合起来,这样可以避免栈溢出或内存浪费的情况。
       在设计共享栈的时候,由于一个数组(大小为MaxSize)有两端点,两个栈有两个栈底,让一个栈的栈底为数组的是始端,即下表为0处,另一个栈的栈底的为数组的末端,即下表为MaxSize-1处,这样,在两个栈中进栈元素时,栈顶向中间伸展。
请添加图片描述

1.3.3.1 共享栈的4要素
  • 栈空:栈1为空top == -1;栈2为空top2 == MaxSize。
  • 栈满:top1 == top2-1。
  • 进栈:栈1进栈top1++ ; data[top1] = x; ==> data[++top1] = x;
               栈2进栈top-- ; data[top2] = x; ==> data[–top] = x;
  • 出栈:栈1出栈x = data[top1];top-- ; ==> x = data[top1–];
               栈2出栈x = data[top2] ; top2++; ==> x = data[top2++];

1.4 栈的链式存储

       即采用链式存储的栈称为链栈,但是与链表不同的是,链栈只有单链栈,不存在双链栈,所以将单链栈也直接称为链栈。

1.4.1 链栈的实现

       采用带头结点的单链表来实现栈链

1.4.2 链栈的4个要素

  • 栈空:s->next == NULL;
  • 栈满:因为是链栈,只有在内存溢出的情况下,才会出现满栈的情况,所以一般情况不考虑;
  • 进栈:新建一个结点存放元素e(由p指向它),将结点p插入头结点之后。
  • 出栈:取出首结点的data值并将其删除

注:
本文将主要探讨栈的概念,其中提及的各个函数操作将在后续的文章中详细展示,敬请读者期待。
上一篇文章
数据结构的概念大合集02(线性表)
下一篇文章
数据结构的概念大合集04(队列)

相关文章:

  • 使用Docker搭建Jellyfin
  • 阿里提前批(阿里云)一面30min
  • 【机器学习】分类模型的评价方法
  • 更安全的C gets()和str* 以及fgets和strcspn的用法
  • 【基础CSS】
  • 3.Windows下安装MongoDB和Compass教程
  • JavaScprit之初识面向对象
  • 用所有语言写“Hello, World!“
  • WebRTC:真正了解 RTP 和 RTCP
  • C++从零开始(day52)——unordered_set,unordered_map学习使用
  • Visual Studio项目模板的创建与使用
  • 基于 K8s 容器集群的容灾架构与方案
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • 淘宝基于Nginx二次开发的Tengine服务器
  • 「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架
  • 【翻译】babel对TC39装饰器草案的实现
  • Angular 4.x 动态创建组件
  • CSS 提示工具(Tooltip)
  • gops —— Go 程序诊断分析工具
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript设计模式系列一:工厂模式
  • jquery ajax学习笔记
  • JS学习笔记——闭包
  • React的组件模式
  • SegmentFault 2015 Top Rank
  • TCP拥塞控制
  • Webpack 4 学习01(基础配置)
  • 百度地图API标注+时间轴组件
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 开源SQL-on-Hadoop系统一览
  • 中文输入法与React文本输入框的问题与解决方案
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #微信小程序:微信小程序常见的配置传值
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (javascript)再说document.body.scrollTop的使用问题
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (第61天)多租户架构(CDB/PDB)
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (三) diretfbrc详解
  • (一)80c52学习之旅-起始篇
  • (转)jQuery 基础
  • (转)Sql Server 保留几位小数的两种做法
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ***利用Ms05002溢出找“肉鸡
  • .NET Core WebAPI中封装Swagger配置
  • .net 反编译_.net反编译的相关问题
  • .NET 反射 Reflect
  • .NET 事件模型教程(二)
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)