n3.队列

news2024/11/17 12:57:40

1.队列

  • 和堆栈一样,队列也属于受限制的线性表。
    在这里插入图片描述

和堆栈不同的是,堆栈只能在一端进行出栈和入栈 (先进后出),而队列只能在尾部插入,在头部删除(先进先出)**。
在这里插入图片描述

队列的操作

——入看满不满,出看空不空——
在这里插入图片描述

2.队列的顺序储存

  • 队列的顺序储存一般由一个一维数组+记录头部位置的变量front+记录尾部位置的变量rear组成。
    对比堆栈,只需要数组和指示栈顶位置的变量Top。

  • front等于第一个元素的前一个下标索引;rear等于最后一个元素的下标索引,且一开始空队列front和rear的值都为-1。

  • 数据按照先来后到的原则从头往后排、先入先出,插入元素在尾部插入,与rear相关;删除元素在头部删除,与front相关。
    在这里插入图片描述

  • 当列表的最后方已经没有空间,但是前方还有余下的空间的时候,如何再插入元素呢:
    在这里插入图片描述

  • 顺环队列:
    在这里插入图片描述

当顺环队列加满的时候,再一次 front == rear 。
解决方法:
1使用额外标记Size或者Tag。Size用来记录数组的大小,Size=0就为空,Size=n就满了;插入一个元素,Tag=1、删除一个元素Tag=0,那么可以根据Tag的值来看当front==rear的时候究竟是空还是满。
2大小为n的数组a[n],可以放入n个元素,但是仅使用n-1个空间,那么就不会出现满的情况。注意不是不可使用头部所空的空间,而是无论是用什么空间,只要保证元素个数不超过n-1即可!
以下代码基于方法2;

初始化

#define MaxSize <最大个数>
struct QNode{
	ElementType Data[MaxSize];
	int rear;
	int front;
};
typedef struct QNode* Queue;

入队列

void AddQ(Queue PtrQ,ElementType item)
{// (PtrQ->rear+1)%MaxSize 实现索引下标的循环
	if( (PtrQ->rear+1)%MaxSize == PtrQ->front )
		printf("队列已满,不可插入");//检查队列是不是满了
	else
	{
		PtrQ->rear = (PtrQ->rear+1)%MaxSize;
		PtrQ->Data[PtrQ->rear] = item;
	}
}
比如一个数组a[n = 3],它的元素下标分别为a[0],a[1],a[2]。当rear指向a[2],并且a[0]和a[1]都是空的,要插入一个元素到a[0],(2+1) % 3 = 0!

出队列

删除队列头部的元素,并且返回这个歌元素的值

ElementType DeleteQ(Queue PtrQ)
{
	if(PtrQ->front == PtrQ->rear)
		printf("队列是空的,无法出队");
	else
	{	
		PtrQ->front = (PtrQ->front+1) % MaxSize;//front+1正好就是原来头部元素的位置
		result = PtrQ->Data[PtrQ->front];//在这里正好返回
	}
	return result ;
}

3.队列的链式储存

可以用一个单链表来实现,插入和删除操作在链表的两头进行。

  • 链表的Head端对于插入和删除操作都是可以是实现的:插入操作,新节点指向Head指向的结点,Head指向的结点改为指向新节点。删除操作,Head直接跳过第一个节点指向第二个节点。
  • 链表的尾端:插入操作,最后一个节点指向新节点。非常不方便进行删除操作,因为这是单向链表,删除最后一个节点之后无法得知上一个节点在哪。
    所以只能让链表的Head端做front删除,尾端做rear插入
    理解:队列是一种先进先出(FIFO)的数据结构,应该保持元素的顺序,第一个结点先产生,记为front;最后那个节点记为rear。

初始化

//建立链表的 结点结构
struct Node{
	ElementType Data;//每个节点包含的数据
	struct Node* Next;//每个节点和后一个节点进行连接
};
//链表队列信息 储存结构--代表队列
struct QNode{
	struct Node* rear;//指向链表中作为队列尾的结点
	struct Node* front;//指向链表中作为队列头的结点
};
typedef struct QNode* Queue;
Queue PtrQ;

注意,不需要头结点!!
在这里插入图片描述

出队

删除头结点(第一个节点),然后返回它的Data值; 出队通常先检查空不空,排除链表为空的情况之后要马上跟上---释放结点的copy、以及return的赋值--,在链表出队程序的--最后再释放空间、return值--。因为如果在if语句块中再进行则代码需要重复多次。

ElementType DeleteQ(Queue PtrQ)
{
	if(PtrQ->front == NULL)//第一步总是要判断是不是空的
		printf("这个链表是空的");
	struct Node* Front = PtrQ->front;//copy一下便于后边释放内存
	ElementType copy = PtrQ->front->Data;
	else if(PtrQ->front->Next == NULL)
		PtrQ->front = PtrQ->rear = NULL;//考虑这个链表只有一个节点,删除之后front和rear所指的都是NULL,否则的话只要改变front就行了
/*或者写成这样:	else if(PtrQ->front == PtrQ->rear)
		PtrQ->front = PtrQ->rear = NULL;  */
	else
	{
		PtrQ->front = Front->Next;
	}
	free(Front);
	return copy;
}

入队

void AddQ(Queue PtrQ,ElementType item)
{
	struct Node* new = malloc(sizeof(struct Node));
	new->Data = item;
	new->Next = NULL;
	if(PtrQ->front == NULL)//空链表的状态是front和rear指向的都是NULL,第一个是NULL最后一个是NULL
	{
		PtrQ->front = PtrQ->rear = new;//第一个是new最后一个还是new
	}
	else//至少有一个结点的情况
	{//front指向第一个节点不动,rear指向的末结点先指向new,然后再让rear指向new,完成更新
		PtrQ->rear->Next = new;
		PtrQ->rear = new;
	}
}

易错题:
在这里插入图片描述

提示:先插7个,后删3个(圆盘状循环队列)

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

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

相关文章

8个免费视频素材网站,让你永久告别资源付费!

视频剪辑&#xff0c;需要用到各种类型的视频素材&#xff0c;一定要收藏好这8个网站&#xff0c;免费下载&#xff0c;让你永久告别资源付费&#xff0c;白嫖真爽。 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但…

【编译原理】手工打造语法分析器

重点&#xff1a; 语法分析的原理递归下降算法&#xff08;Recursive Descent Parsing&#xff09;上下文无关文法&#xff08;Context-free Grammar&#xff0c;CFG&#xff09; 关键点&#xff1a; 左递归问题深度遍历求值 - 后续遍历 上一篇「词法分析器」将字符串拆分为…

idea的后端环境配置

首先&#xff0c;在你刚打开idea时红色箭头所指的是你进行配置的地方&#xff0c;接下来我把具体步骤说一下 1&#xff0c;直接点击箭头所指的地方就会出现如图界面&#xff0c;然后点击Tomcat server,使其展开点击第一个 第二步取消勾选&#xff0c;第三步选择bin的上一级然后…

14届蓝桥杯省赛 C/C++ B组 T8 整数删除(双向链表,堆)

瞬间定位一个数的左边或者右边&#xff0c;需要用到双向链表。 在过程中不断维护最小值&#xff0c;需要用到堆。 所以定义一个pair类型优先队列&#xff0c;每次取出堆顶进行删除&#xff0c;并且同时让删除元素的左右元素加上其值。 同时需要注意&#xff0c;在删除元素之后…

Spring Cloud Hoxton.SR7 Supported Boot Version: 2.3.2.RELEASE

1、地址 Spring Cloudhttps://docs.spring.io/spring-cloud/docs/Hoxton.SR7/reference/html/ 2、 截图

探索K-近邻算法(KNN):原理、实践应用与文本分类实战

第一部分&#xff1a;引言与背景 KNN算法在机器学习领域的重要性及其地位 KNN算法作为机器学习中的基石之一&#xff0c;由于其概念直观、易于理解并且不需要复杂的模型训练过程&#xff0c;被广泛应用于多种场景。它在监督学习中占据着特殊的位置&#xff0c;尤其适用于实时…

Oracle数据库启动顺序

Oracle数据库启动顺序 启动数据库 首先使用oracle用户登录Linux&#xff0c;用lsnrctl status查看监听状态 1、&#xff1a;进入sqlplus $ sqlplus /nolog SQL> 2&#xff1a;使用sysdab角色登录sqlplus SQL> conn /as sysdba 3&#xff1a;启动数据库 SQL> startup …

宝藏推荐|GitHub登顶项目之中文排行榜!开源资料,天花板级别!

&#x1f680;近年来&#xff0c;开源的力量愈发显现其重要性&#xff0c; 不仅推动了技术的发展&#xff0c;更改变了世界的面貌。 马斯克&#xff0c;这位科技界的巨星也多次强调开源的重要性&#xff0c; 他深知只有共享知识&#xff0c;才能推动人类文明的进步&#x1f…

Atcode搜索

D - Medicines on Grid (atcoder.jp) 这是一道搜索题目&#xff0c;我们使用bfs来做&#xff0c;因为本题目没让你求最小路径&#xff0c;使用dfs也可以&#xff0c;这里使用bfs。 本题目核心思想如下&#xff1a; 小高要从起点到终点&#xff0c;要求其在能量大于等于0时到…

搜索与图论——拓扑排序

有向图的拓扑排序就是图的宽度优先遍历的一个应用 有向无环图一定存在拓扑序列&#xff08;有向无环图又被称为拓扑图&#xff09;&#xff0c;有向有环图一定不存在拓扑序列。无向图没有拓扑序列。 拓扑序列&#xff1a;将一个图排成拓扑序后&#xff0c;所有的边都是从前指…

k8s1.28-helm安装kafka-Raft集群

参考文档 [Raft Kafka on k8s 部署实战操作 - 掘金 (juejin.cn)](https://juejin.cn/post/7349437605857411083?fromsearch-suggest)部署 Raft Kafka&#xff08;Kafka 3.3.1 及以上版本引入的 KRaft 模式&#xff09;在 Kubernetes (k8s) 上&#xff0c;可以简化 Kafka 集群…

分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机数据…

一文彻底搞懂JAVA 异常分类及处理

文章目录 1. 概念2. 异常分类3. 异常的处理方式4. throw 和 throws 的区别 1. 概念 如果某个方法不能按照正常的途径完成任务&#xff0c;就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时&#xff0c;这个方法会立刻退出同时不返回任何值。另…

蓝桥杯第十四届C++C组

三国游戏 题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i 个事件发生时会分别让 X, Y, Z 增加Ai , Bi ,Ci …

【1】初识 Python

【1】初识 Python 1、编程语言(1) 语言(2) 编程语言(3) 如何利用编程语言与计算机交流(4) 常见的编程语言(5) 语法 2、Python 简介(1) 什么是 Python(2) Python 能做什么(3) Python 的由来(4) Python的特点① 语法精简② 生态好&#xff0c;开发效率高③ Python开发初体验&…

全国计算机等级考试三级Linux应用与开发技术考试-习题汇总

https://blog.csdn.net/qq_42025798/article/details/119155696 3.第1章-计算机体系结构与操作系统-练习题-简答题 https://blog.csdn.net/qq_42025798/article/details/119186151 4.第1章-计算机体系结构与操作系统-练习题-填空题 https://blog.csdn.net/qq_42025798/article/…

风险模型总结

系统性风险 系统性风险&#xff08;Systematic Risk&#xff09;微观层面的定义由夏普&#xff08;William Sharpe&#xff09;在资本资产定价模型&#xff08;CAPM&#xff09;中首次提出&#xff0c;即资本市场中存在的不能通过分散投资予以消除的风险 模型也会带来风险 详…

xhadmin多应用Saas框架和FastAdmin有什么区别?

xhadmin是什么&#xff1f; xhadmin 是一套基于最新技术的研发的多应用 Saas 框架&#xff0c;支持在线升级和安装模块及模板&#xff0c;拥有良好的开发框架、成熟稳定的技术解决方案、提供丰富的扩展功能。为开发者赋能&#xff0c;助力企业发展、国家富强&#xff0c;致力于…

mac老版本如何升级到最新版本

mac老版本如何升级到最新版本 老macbook升级新版本&#xff08;Big sur、Monterey&#xff09; 首先介绍我的电脑的机型及情况&#xff1a; 2015年初的MacBook Air 处理器是1.6Hz 双核Interl Core i5 内存4G 老版本只能升到10.13 想要升到最高版本的原因&#xff1a;想要注册…

# Set rootfs type, including ext2 ext4 squashfs export RK_ROOTFS_TYPE=ext4

ext2、ext4和squashfs是Linux系统中常见的几种文件系统类型&#xff0c;每种文件系统都有其特点和用途&#xff1a; ext2 (Second Extended Filesystem) 是Linux中较早使用的文件系统。它不支持日志功能&#xff0c;因此在系统意外崩溃或断电后的恢复时间可能会比较长&#xff…