[考研数据结构] 第3章之队列的基本知识与操作

news2025/1/14 1:03:13

文章目录

队列的基本概念

队列的顺序存储

顺序队列

 存储类型

基本操作

循序队列

 存储类型

基本操作

循环队列判空与判满的三种解决方案  

方法一:牺牲一个存储单元

方法二:类型增设记录型变量size

方法三:类型增设标志型变量tag

队列的链式存储

链队的存储类型

链队的基本操作

初始化

判空

入队

出队

双端队列

总结


队列的基本概念

        队列(Queue)简称队,是一种操作受限的线性表。只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称入队或进队,删除元素称为出队或离队。   和生活中的排队一致,具有先进先出(First In First Out)的特性。

相关术语

  • 队头(Front):允许删除的一端,又称队首
  • 队尾(Rear):允许插入的一端
  • 空队列:不含有任何元素的空表

基本操作

  • InitQueue(&Q):初始化队列
  • QueueEmpty(Q):判断队列是否为空
  • EnQueue(&Q,x):入队,若队列未满,则将x加入到队列,称为新的队尾
  • DeQueue(&Q,&x):出队,若队列非空,则删除队头元素,并存储在x中返回
  • GeyHead(Q,&x):读取队头元素,若队列Q非空,则将队头元素赋值给x

队列的顺序存储

顺序队列

        队列的顺序实现是指分配一块连续的存储单元存放在队列的元素 ,并附设两个指针:队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个位置(也可以直接指向队尾元素,根据题意具体情况具体分析)。

 存储类型

//顺序队列的存储类型
#define MaxSize 50
typedef struct{
	ElemType data[MaxSize];
	int front,reat;
}SqQueue; 

基本操作

  • 初始状态(队空状态): Q.front==Q.rear==0
  • 进队操作:队不满时,先送值到队尾元素,再将队尾指针加1
  • 出队操作:队不空时,先取队头元素值,再将队头指针加1


循序队列

         将顺序队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上视为一个环,称为循环队列。当队首指针Q.front=MaxSize-1后,再前进一个位置就自动为0,这可以利用除法取余运算(%)来实现。

 存储类型

//循环队列的存储类型
#define MaxSize 50
typedef struct{
	ElemType data[MaxSize];
	int front,reat;
}SqQueue; 

基本操作

  • 初始化:Q.front=Q.rear=0
//队列的初始化
void InitQueue(SqQueue &Q){
	Q.rear=Q.front=0;//初始化队尾与队首指针 
} 
  • 判空: Q.rear==Q.front
//判断队空
bool isEmpty(SqQueue Q){
	if(Q.rear==Q.front)return true;//队空的条件 
	else return false;//队非空 
} 
  • 出队:Q.front=(Q.front+1)%MaxSize
//出队
bool DeQueue(SqQueue &Q,int &x){
	//如果队空,则出队失败 
	if(Q.rear==Q.front){
		return false;
	}
	x=Q.data[Q.front];
	Q.front=(Q.front+1)%MaxSize;
	return true; 
} 
  • 入队:Q.rear=(Q.rear+1)%MaxSize
//入队
bool EnQueue(SqQueue &Q,int x){
	//如果队满,则入队失败 
	if((Q.rear+1)%MaxSize==Q.front){
		return false;
	}
	Q.data[Q.rear]=x;
	Q.rear=(Q.rear+1)%MaxSize;
	return true;
} 
  • 队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
//求队列的长度 
int getLength(SqQueue Q){
	//如果队空,则返回0 
	if(Q.rear==Q.front){
		return 0;
	}
	return (Q.rear+MaxSize-Q.front)%MaxSize;//返回队列长度 
} 

出队入队时,指针都是按照顺时针方向进1,如下图所示:

循环队列判空与判满的三种解决方案  

如上图所示,队空的条件是Q.front==Q.rear,但是我们发现一个问题:当入队的速度快于出队的速度时,则队尾指针很快就会追上队头指针,如上图d1所示,此时队满的时候也有Q.front==Q.rear这一条件,这样就无法真正区分循环队列队空还是队满,为此有以下三个解决方案:

方法一:牺牲一个存储单元

        牺牲一个单元来区分队空和队满,即在入队时少用一个队列单元,约定以“队头指针再队尾指针的下一个位置作为队满的标志”,如上图d2所示。

采用这种方式后:

  • 队满条件: (Q.rear+1)% MaxSize==Q.front
  • 队空条件: Q.rear==Q.front
  • 队列元素个数: (Q.rear-Q.front+MaxSize)%MaxSize

方法二:类型增设记录型变量size

        在队列的存储类型中新增加一个表示元素个数的成员变量size,这样队空的条件为Q.size==0;队满的条件为Q.size=MaxSize

方法三:类型增设标志型变量tag

        在队列的存储类型中新增tag成员变量,以区分队空和队满。当tag==0时,若因删除而导致Q.rear==Q.front,则为队空;当tag==1时,若因而导致Q.rear==Q.front,则为队满

 


队列的链式存储

        队列的链式存储称为链队列,简称链队。它是一个同时带有队头指针与队尾指针的单链表。头指针指向队头结点,尾指针指向队尾结点,即单链表的最后一个结点。

 

链队的存储类型

#define MaxSize 50
//链队中的结点元素 
typedef struct LinkNode{
	int data;
	struct LinkNode *next;
}LinkNode;
//链队 
typedef struct{
	LinkNode *front,*rear;//队列的队头指针与队尾指针 
}LinkQueue;

链队的基本操作

初始化

//链队的初始化
void InitQueue(LinkQueue &Q){
	Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));//建立头结点
	Q.front->next=NULL;//初始为空 
} 

判空

//判断队空
bool isEmpty(LinkQueue Q){
	if(Q.rear==Q.front)return true;//队空的条件 
	else return false;//队非空 
} 

入队

//入队
bool EnQueue(LinkQueue &Q,int x){
	//创建新结点 
	LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode)); 
	s->data=x; s->next=NULL;
	//将新结点插入到链尾,类似单链表的尾插法 
	Q.rear->next=s;
	Q.rear=s;
	return true; 
} 

出队

//出队
bool DeQueue(LinkQueue &Q,int &x){
	//如果队空,则出队失败
	if(Q.rear==Q.front){
		return false;
	} 
	LinkNode *p=Q.front->next;//新建一个临时结点存储当前队头元素,即待删除的元素 
	x=p->data;//将需要删除的元素值存储进x并返回 
	Q.front->next=p->next;//修改头结点的指针域,使其指向原来链表的第二个结点,达到逻辑上删除队头结点的效果
	//若原链队中只有一个结点,则删除后将变空,需要修改队头与队尾指针使二者相等达到队空的条件 
	if(Q.rear==p){
		Q.rear=Q.front;
	} 
	free(p);//释放待删除结点的内存空间,达到物理上真正的删除 
	return true;
} 

双端队列

        双端队列是指允许两端都可以进行入队或者出队操作的队列。其元素的逻辑结构仍为线性结构,将队列的两端分别称之为前端和后端,两端都可以进行入队与出队操作。

 双端队列常以选择题的形式考察,对代码要求不高,感兴趣的同学请参考下面这篇文章。

C语言实现双端队列icon-default.png?t=N3I4https://blog.csdn.net/Quarrie/article/details/104402199?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%8F%8C%E7%AB%AF%E9%98%9F%E5%88%97C%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-104402199.142^v84^koosearch_v1,239^v2^insert_chatgpt&spm=1018.2226.3001.4187


总结

  • 队列具有先进先出特性,结合生活中的排队现象加以理解。注意与栈的后进先出特性进行区分
  • 栈和队列都是操作受限的线性表,栈只允许在栈顶增加与删除元素,即在表的一端进行操作;队列只允许在队尾加入元素在队头删除元素,即在表的两端进行操作;所以,并不是所有对线性表的操作都能够作用于栈和队列,如随便读取栈或队列中间的某个元素,这是无法实现的

  • 顺序队列中注意队尾指针Q.rear指向的是队尾元素的下一个元素还是当前队尾元素,注意审题
  • 熟悉循环队列判满条件,判空条件,求队列元素个数,以及出队时队头指针与入队时队尾指针如何变化,这是常考点也是重点内容
  • 熟悉循环队列中区分队空和队满条件的三大解决方案,以及每种方案下判断循环队列队空与队满的条件。
  • 法一:牺牲一个存储单元

  •  法二,类型中新增表示元素个数的成员变量size

 

  • 法三,类型中新增标志变量tag

  • 掌握双端队列中,如何根据已知的出队序列判断是否能够由双端队列入队实现,如果能,能够写出合理的双端队列入队序列,重点

END.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式【协议篇】CAN协议原理

一、CAN协议介绍 1、简介 CAN是控制器局域网络(Controller Area Network, CAN)的简称,是一种能够实现分布式实时控制的串行通信网络。 其实可以简单把CAN通信理解成开一场电话会议,当一个人讲话时其他人就听(广播),当多个人同时讲话时则根据一定规则来决定谁先讲话谁后讲…

【音视频】 zlm的几个代理接口解释

目录 12、/index/api/addStreamProxy 30、/index/api/addStreamPusherProxy 14、/index/api/addFFmpegSource 24、/index/api/openRtpServer 27、/index/api/startSendRtp 参考 12、/index/api/addStreamProxy 拉流代理 : 194上在播放。 而10.30.2.6上加上这个…

FastDGCNN

Faster Dynamic Graph CNN: Faster Deep Learning on 3D Point Cloud Data | IEEE Journals & Magazine | IEEE Xplore ​​​​​​​题目:Faster Dynamic Graph CNN: Faster Deep Learning on 3D Point Cloud Data(更快的动态图形CNN:对…

Android 对View 进行旋转、缩放、平移的属性变换后,获取外矩形顶点

文章目录 前言改变 View 的属性,进行旋转、缩放、平移输出 View 的属性 使用 matrix 映射 view 变换后的外矩形前(左)乘(preXxx)、后(右)乘(postXxx) 对映射结果的影响前(左)乘(preXxx) 的意义后(右)乘(postXxx) 结论 来张图 前言 Android View 通过平移、旋转、…

找PPT模板就上这5个网站~

分享几个可以永久免费下载PPT模板、素材的网站,上万个模板随便下载,赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYxMjky 网站素材非常全面,主要以设计类素材为主,办公类素材也很多&#x…

4、RSA终端指令

RSA总结 加密算法,都是数学知识对称加密(传统加密算法)RSA(三个人的名字)非对称加密(现代加密算法) 原根欧拉函数、欧拉定理(费马小定理)模反元素 m^(e * d) mod n ≡ m迪菲赫尔曼密钥交换RSA算法 RSA: 拆解两个(大)质数的乘积很难!所以RSA想对安全.加密: M ^e % N C解密: C…

前端学习:HTML头部、布局

目录 HTML头部 一、HTML 元素 二、head标签和header标签的不同 三、HTML 元素 四、HTML 元素 五、HTML 元素 六、 HTML 七、HTML元素 为搜索引擎定义关键词: 为网页定义描述内容: 每60秒刷新当前页面: 八、HTML 九、HTML头部元素…

Vue项目搭建流程

目录 1、通过命令创建 2、npm下载依赖 3、路由配置 4、配置组件 5、对axios进行二次封装 6、全局接口请求封装 7、配置跨域(反向代理) 1、通过命令创建 create vue 项目名 2、npm下载依赖 nmp i 依赖名版本号 axios1.2.1 echarts5.1.2 element-ui2.15.12 vue-router3…

56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载

文章目录 56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载56.1 安装56.2 运行56.3 卸载 56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载 56.1 安装 配置本地yum源,详细信息请参考《openEuler 22.03-LTS 搭建repo服务器》。 清除缓存。 # dnf clean…

【SpringBoot】1、SpringBoot整合JWT实现Token验证

这里写目录标题 1.单点登录1.1 单系统登录1.1.1 单系统登录流程(使用Session实现单系统登录) 1.2 多系统(单点)登录1.2.1 单点登录实现方案1.2.1.1 Session跨域1.2.1.2 Spring Session共享 1.3 Token机制1.3.1 传统身份认证1.3.2 基于Token的身份认证 1.4 JWT机制1.4.1 JWT数据…

Redis集群部署详解

文章目录 集群环境集群搭建测试集群故障转移集群扩容集群缩容 集群环境 集群介绍 1.什么是集群 所谓的集群,就是通过增加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态。 2.使用redis集群的必要性 单个redis存在不稳定…

9.6 数组的指针和指向数组的指针变量 - 3

9.6 数组的指针和指向数组的指针变量 - 3 一.回顾二维数组和多维数组的概念二.指向多维数组的指针和指针变量探究1.a:二维数组名,也是整个二维数组的首地址。我们可以认为是第0行的首地址是10002.a1 , a2 分别代表第一行首地址和第二行首地址。3.这表示a[0],a[1],a[…

Mapbox-gl.js v2.13.0 扩展支持4326,4490坐标系

mapbox-gl.js新版本中,支持多种projection 显示效果也不错,根据tiles grid可以看到,还是web_mercator的格网,基于图片做了一定的拉伸形变,想要加载4326的切片格网,依然无法实现。 后来在网上搜索加载4326切…

【JavaWeb】后端(Maven+SpringBoot+HTTP+Tomcat)

目录 一、Maven1.什么是Maven?2.Maven的作用?3.介绍4.安装5.IDEA集成Maven6.IDEA创建Maven项目7.IDEA导入Maven项目8.依赖配置9.依赖传递10.依赖范围11.生命周期 二、SpringBoot1.Spring2.SpringBoot3.SpringBootWeb快速入门 二、HTTP1.HTTP-概述2.HTTP-请求协议3.HTTP-响应协…

【转行互联网】转行互联网必看答疑

课程 追忆寻梦-转行互联网必备知识 https://edu.csdn.net/course/detail/31180 2023年,迟来的编程私教服务 https://bbs.csdn.net/topics/613231237 优先 必读文章 初学者,打算改行学编程,怎么学习java?求指教。https://bb…

如何抓住IT行业最后的红利?网络安全为什么是风口行业?

前言 “没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万…

C语言指针及数组的运行原理

C语言指针及数组的运行原理 文章目录 C语言指针及数组的运行原理一. 指针(汇编角度)二. 数组(汇编角度)2.1 数组的定义2.2 指针与数组结合 三. 指令解释参考3.1 nop3.2 leave3.3 ret 这里涉及汇编,虚拟机这边采用的是6…

如何在 Google Cloud 上部署 EMQX 企业版

Google Cloud 的 IoT Core 产品将于 2023 年 8 月 16 日停止服务,随着这一日期的临近,许多用户正在为他们现有的物联网业务寻找新的解决方案,而 EMQX 企业版是实现这一目标的理想选择。 EMQX 企业版是一款大规模分布式 MQTT 消息服务平台&am…

【设计模式】深入浅出--外观模式

文章目录 前言一、外观模式介绍二、案例场景三、外观模式优缺点四、外观模式应用场景总结 前言 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶、茶具和开水,而去茶馆喝茶,最简单的方式就是跟茶馆服务员…

高效的配置文件读取工具支持properties和yaml

JefConfig 前言 日常工作中不知道到大家有没有遇到以下几种情况: 1、在程序启动时需要加载配置文件,但是发现程序只能从固定位置读取配置文件。 2、程序在集成了spring框架后,想从配置文件中获取某个配置,但是发现当前程序并未交…