数据结构栈(顺序栈、链栈、插入push、删除pop)、队(循环队,链队、入队push,出队pop)知识点梳理

article/2025/8/16 9:01:14

数据结构栈知识点梳理

一 栈的定义

栈(stack)是限定仅在表尾进行插入和删除操作的线性表

  • 不含任何元素的栈称为空栈

  • 允许插入和删除的一端成为栈顶(top),另一端称为栈底(bottom)

  • 具有LIFO(Last In First Out)结构

  • 栈元素具有线性关系,即前驱和后继,是特殊的线性表

二 栈的插入、删除
  • 栈的插入操作—进栈(push)

在这里插入图片描述

  • 栈的删除操作—出栈(pop)

在这里插入图片描述

三 栈的抽象数据类型
ADT 栈(stack)
Data同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系
OperationInitStack(&S):初始化操作,建立一个空栈SDestroyStack(*S):若栈存在,则销毁它ClearStack(*S):将栈清空StackEmpty(S):若栈为空,返回true,否则返回falseGetTop(S,*e):若栈存在且非空,用e返回S的栈顶元素Push(*S,e):若栈S存在,插入新元素e到栈S中并称为栈顶元素Pop(*S,*e):删除栈S中栈顶元素,并用e返回其值StackLength(S):返回栈S的元素个数
endADT
四 栈的顺序存储结构

栈只能在一头插入和删除,下标为0的一端作栈底比较好。定义一个top变量来指示栈顶元素在数组中的位置。

存储栈的长度StackSize,栈顶位置top必须小于StackSize。

当栈有一个元素时,top=0,所以空栈的判定条件为top=-1

出栈和入栈的时间复杂度都是O(1)

  • 栈的结构定义
typedef int SElemType;/*SElemType 类型根据实际情况而定,这里假设为int*/
typedef struct
{SElemType data[MAXSIZE];int top;/*栈顶指针*/
}SqStack;
  • 进栈操作

在这里插入图片描述

进栈push操作

Status Push(SqStack *S,SElemType e)
{if(S->top == MAXSIZE - 1)/*栈满*/{return ERROR;}S->top++;/*栈顶指针+1*/S->data[S->top] = e;/*将新插入元素赋值给栈顶空间*/return OK;
}
  • 出栈操作
Status Pop(SqStack *S,SElemType *e)
{if(S->top == -1)return ERROR;*e = S->data[S->top]; /*将要删除的栈顶元素赋值给e*/S->top--;return OK;
}
五 两栈共享空间

栈的顺序存储

优点:插入和删除操作不需要元素

缺点:需要提前确认存储空间,或者用编程手段扩容,空间利用率不高

解决方法:两栈共享空间,为了增加空间利用率,可以用一个数组来存储两个栈

如图:让一个栈的栈底为数组的始端(下标为0处),另一个栈为栈的末端(下标n-1处),两个栈的元素增加,向中间延伸

栈1为空,top1 == -1;栈2为空,top2 == n;栈满 top1+1 == top2

在这里插入图片描述

/*两栈共享空间结构*/
typedef struct
{SElemType data[MAXSIZE];int top1;int top2;
}SqDoubleStack;
  • 插入操作

增加一个StackNumber判断插入栈1还是栈2

/*插入元素e为新的栈顶元素*/
Status	Push(SqDoubleStack *S,SElemType e,int stackNumber)
{if(S->top1+1 == S->top2)return ERROR;if(stackNumber == 1)S->data[++S->top1]=e;else if(stackNumber == 2)S->data[--S->top2]=e;return OK;
}
  • 插入操作
/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR*/
Status Pop(SqDoubleStack *S,SElemType *e,int stackNumber)
{if(stackNumber == 1){if(S->top1 == -1)return ERROR;*e = S->data[S->top1--];}else if(stackNumber == 2){if(S->top2 == MAXSIZE)return ERROR;*e = S->data[S->top2++];}        return OK;
}
六 栈的链式存储结构

链栈不需要头结点

基本不存在栈满的情况,除非内存没有空间

链栈空top == NULL

在这里插入图片描述

  • 链栈结构代码
typedef struct StackNode
{SElemType data;struct StackNode *next;
}StackNode,*LinkStackPtr;typedef struct LinkStack
{LinkStackPtr top;int count;
}LinkStack;
  • 进栈操作

在这里插入图片描述

/*插入元素e为新的栈顶元素*/
Status Push(LinkStack *S,SElemType e)
{LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));s->data=e;s->next=S->top;	S->top=s;S->count++;return OK;
}
  • 出栈操作

在这里插入图片描述

Status Pop(LinkStack *S,SElemType *e)
{LinkStackPtr p;if(StackEmpty(*s))return ERROR;*e=S->top->data;p=S->top;S->top = S->top->next;free(p);S->count--;return OK;
}
七 总结

栈在使用过程中元素变化不可预料,有时很小,有时很大,那么最好用链栈。反之,大小在可控的范围内,用顺序栈。

栈更多的应用在递归

数据结构队知识点梳理

一 定义

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表

队列是一种先进先出(First In First Out)的线性表

允许插入的一端称队尾,允许删除的一端称队头

在这里插入图片描述

二 队列的抽象数据结构
ADT 队列(Queue)
Data同线性表。元素具有相同的类型,相邻元素具有前驱和后继
OperationInitQueue(*Q):初始化操作,建立一个空队列QDestroyQueue(*Q):若队列Q存在,则销毁它ClearQueue(*Q):将队列清空QueueEmpty(Q):若队列为空,返回true,否则返回falseGetHead(Q,*e):若队列Q存在且非空,用e返回队列Q的队头元素EnQueue(*Q,e):若队列存在,插入新元素e到队列Q中并成为队尾元素DeQueue(*Q,*e):删除队列Q中的队头元素,并用e返回其值QueueLength(Q):返回队列Q中的元素个数
endADT
三 循环队列
  • 顺序存储结构存在不足容易发生数组越界的错误,假溢出现象。

  • 两个指针

    为了避免队尾和队头重合使处理十分麻烦,所以引入两个指针。front指针指向队头元素,rear指针指向队尾元素;front==rear时,指空队列

  • 循环队列定义

    头尾相接顺序存储结构称为循环队列。

  • 出现的问题

在这里插入图片描述

当front==rear的时候可能是队列为空,或可能是队列为满

解决办法:

  • 设置一个标志变量flag,当front == rear,且flag = 0时队列为空,当front == rear,且flag = 1时队列为满。
  • 当队列空时,条件就是front == rear,当队列为满的时候,修改其中的条件,保留一个元素空间,意思就是当队列满的时候,数组中还有一个空闲单元。

第二种解决方式不允许出现的情况

在这里插入图片描述

队满情况

在这里插入图片描述

四 循环队列一些列操作
  • 顺序存储结构代码

队列满的条件:
(rear+1)%QueueSize == front

通用的计算队列长度公式:
(rear-front+QueueSize)%QueueSize

typedef int QElemType;
/*循环队列的顺序存储结构*/
typedef struct
{QElemType data[MAXSIZE];int front;int rear;
}SqQueue;
  • 初始化循环队列
/*初始化一个空队列*/
Status InitQueue(SqQueue *Q)
{Q->front = 0;Q->rear = 0;return OK;
}
  • 循环队列求长度
/*返回Q的元素个数,也就是当前队列的长度*/
int QueueLength(SqQueue Q)
{return (Q.rear - Q.front + MAXSIZE)%MAXSIZE;
}
  • 循环队列的入队
/*若队列未满,则插入元素e为Q新的队尾元素*/
Status EnQueue(SqQueue *Q,QElemType e)
{if((Q->rear+1)%MAXSIZE == Q->front)return ERROR;Q->data[Q->rear] = e;Q->rear = (Q->rear+1)%MAXSIZE;return OK;
}
  • 循环队列的出队
/*若队列不空,则删除Q中队头元素,用e返回其值*/
Status DeQueue(SqQueue *Q,QElemType *e)
{if(Q->front == Q->rear)return ERROR;*e=Q->data[Q->front];Q->front = (Q->front+1)%MAXSIZE;return OK;
}

循环队列面临着数组溢出的问题,所以还需要不用担心队列长度的链式存储结构

五 队列的链式存储结构

理解:队列的存储结构,相当于线性表的单链表,只不过它只能尾进头出,简称链队列

队头指针指向链队的头结点,队尾指针指向终端结点。

在这里插入图片描述

  • 空队列,front和rear都指向头结点

在这里插入图片描述

  • 链队的存储结构
typedef int QElemType
typedef struct QNode /*结点结构*/
{QElemType data;struct QNode *next;
}QNode,*QueuePtr;
typedef struct /*队列的链表结构*/
{QueuePtr front rear;
}LinkQueue;
  • 入队操作

在这里插入图片描述

/*插入元素e为Q的新的队尾元素*/
Status EnQueue(LinkQueue *Q,QElemType e)
{QueuePtr s = (QueuePtr)malloc(sizeof(QNode));if(!s)exit(OVERFLOW);s->data = e;s->next = NULL;Q->rear->next = s;Q->rear = s;return OK;   
}
  • 出队操作

在这里插入图片描述

/*若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR*/
Status DeQueue(LinkQueue *Q,QElemType *e)
{QueuePtr p;if(Q->front == Q->rear)return ERROR;p = Q->front->next;if(Q->rear == p)/*若队头是队尾*/Q->rear = Q->front;free(p);return OK;   
}
六 循环队列和链队的比较

时间上:都是O(1),循环队列事先申请空间,使用不释放;链队申请和释放结点需要耗时。

空间上:循环队列需要固定长度,会造成空间浪费。链队不存在这些问题,更加的灵活多变。


http://chatgpt.dhexx.cn/article/YTZiCAQB.shtml

相关文章

数据结构栈和队列

整本书的知识点,点击右方链接:整本书笔记知识点 文章目录 三、栈和队列3.1、栈和队列的定义和特点3.1.1、栈的定义和特点3.1.2、队列的定义和特点 3.2、案例引入3.3、栈的表示和操作的实现3.3.1、栈的类型定义3.3.2、顺序栈的表示和实现3.3.3、链栈的表示…

C++数据结构——栈

C数据结构——栈 最近计划再复习一遍数据结构,看到一篇博客:https://www.cnblogs.com/QG-whz/p/5170418.html#_label0。 1、栈(Stack)是一种线性存储结构,它具有如下特点: (1)栈中的数据元素遵守“先进后…

数据结构 栈-链栈及基本操作

目录 一.栈的定义二.栈的特点三.栈的理解四.链栈引入五.链栈定义六.链栈的结构体设计七.链栈的基本操作7.1链栈的初始化7.2链栈判空7.3链栈入栈7.4链栈出栈7.4取栈顶元素 八.总结 一.栈的定义 栈是限定仅在表尾进行插入和删除操作的数据结构(受到限制的线性表&…

数据结构之——栈

文章目录 数据结构之——栈一:栈的定义:二:栈的抽象数据类型:三:栈的顺序存储结构及其实现:1: 预说明:2:栈的顺序存储结构——结构定义:3:栈的顺序存储结构——进栈操作4…

数据结构与算法(3)栈

栈 1、栈的一个实际需求 请输入一个表达式:7x2x2-51-53-3 2、栈的介绍 栈的英文为stack 栈是一个**先入后出(FILO-First In Last Out) **的有序列表 栈(stack) 是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。 允许插入和删除的一端…

【数据结构】栈

栈的概念及结构 在学习栈前,我们先看一下栈的正式解释: 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出 L…

什么是栈?

本文将介绍一个重要的数据结构—栈,和之前讲到的链表、数组一样也是一种数据呈线性排列的数据结构,不过在这种结构中,我们只能访问最新添加的数据。栈就像是一摞书,拿到新书时我们会把它放在书堆的最上面,取书时也只能…

【图解数据结构】栈全面总结

目录 一、前言 二、基本概念 三、栈的表示和实现 1.顺序栈 2.链栈 四、栈的常见算法实现 1.初始化 2.判空 3.判满 4.顺序栈取栈顶元素 5.顺序栈入栈 6.顺序栈出栈 五、双栈 1.双端顺序栈进栈操作 2.双端顺序栈出栈操作 六、栈的应用举例 1.回文游戏 2.多进制…

数据结构——栈

栈和队列 栈和队列介绍特点栈、队列与一般线性表的区别栈——stack栈的基本运算栈的存储结构顺序栈链栈 栈的应用 栈和队列 介绍 栈和队列是在软件设计中常用的两种数据结构,它们的逻辑结构和线性表相同 特点 栈和队列在运算上受到了限制:栈是按照“…

遥感影像百分比线性拉伸

AI Earth地球科学云平台开发者模式提供了丰富的遥感数据和函数计算能力,下面介绍结合AIE Notebook,实现遥感数据的百分比线性灰度拉伸。 本期开发者实践案例——遥感影像百分比线性拉伸 灰度拉伸 (GrayScale Stretch) 是遥感影像处理过程中的重要步骤&…

遥感影像分类方法

最初的遥感影像分类是通过目视解译(濮静娟, 1984)来完成的,对研究人员的主观意识有较强的依赖性,而且效率较低,适用于数据量较小的情况,通常作为其他方法对比的对象。目前的遥感图像分类主要以计算机分类为主,因此按照…

遥感影像配准

文章目录 前言步骤1.ENVI:打开Image Registration Workflow2.Image Registration Workflow(1)选择GF2为Base Image File,某季节Sentinel2为Warp,然后Next(2)修改该参数为100(3)人为选择5个左右控制点,然后Next(4)删除离谱点(5)在E…

遥感图像分类技术

什么是遥感图像分类技术? 图像分类是将土地覆盖类别分配给像素的过程。例如,这9个全球土地覆盖数据集将图像分为森林、城市、农业和其他类别。 https://gisgeography.com/free-global-land-cover-land-use-data/ 一般来说,这是遥感中的三种主…

遥感图像分类

遥感图像分类 一、背景简介 遥感图像分类就是利用计算机通过对遥感图像中各类地物的光谱信息和空间信息进行分析,选择特征,将图像中各个像元按照某种规则或算法划分不同的类别,然后获得遥感图像中与实际地物的对应信息,从而实现…

WorldView卫星遥感影像数据/米级分辨率遥感影像

数据样例:百度云下载链接:https://pan.baidu.com/s/17ofPwpDM3OCHnE-LuhvUp 提取码:i0m4 目前世界上最常用的高分辨率卫星影像莫过于WORLDVIEW系列了,在卫星遥感圈内可谓大名鼎鼎,不仅具有超高的分辨率还具有其他高分…

遥感数据下载平台汇总

1中国资源卫星应用中心http://www.cresda.com.cn中巴卫星、HJ星、ZY系列 、GF系列2中科院对地观测与数字地球科学中心http://ids.ceode.ac.cn/Index.aspxERS卫星,Enviset_1卫星,法国的spot4卫星,中巴资源卫星,landset-5-73地球系统…

遥感多光谱数据下载与预处理(一、数据选择 下载)

首先说明本人并非专业大牛,不是教程贴只是记录一下学习过程和大家交流,过程有不严谨不合规范不对的地方欢迎各位大神指正。 本人目前做过接触过最多的是多光谱遥感数据,也是与无人机、雷达、高光谱等相比最简单的一种,这是我自己总…

地理空间数据云下载遥感影像

目录 1、先上网址:www.gscloud.cn 2、介绍界面: 2.1 “数据资源” 2.2 “高级检索” 1、先上网址:www.gscloud.cn 2、介绍界面: 地理空间数据云,作为国内免费下载遥感卫星影像的一个大平台,随着年代发…

遥感图像入门

遥感图像入门 一、 遥感基本概念地物光谱特性3S 技术瑞利散射大气窗口 二、 遥感系统的组成三、 遥感分类四、 遥感数字图像处理图像与数字图像数字图像获取时的基本参数数字图像类型 一、 遥感基本概念 遥感(Remote Sensing)——遥远的感知,在未接触物体的情况下获…

遥感影像的几何校正

一、引言(INTRODUCTION) 图像校正主要是指辐射校正和几何校正。辐射校正包括传感器的辐射校正、大气校正、照度校正遗迹条纹和斑点的判定和消除。几何校正就是校正成像过程中造成的各种几何畸变,包括几何粗校正和几何精校正。几何粗校正是针对…