1.5 队列概念,应用及部分实现

news2025/1/4 17:41:51

1.基本概念

队列( Queue ):也是运算受限的线性表。是一种先进先出( First In First Out ,简称
FIFO )的线性表。只允许在表的一端进行插入,而在另一端进行删除。
队首( front ) :允许进行删除的一端称为队首;
队尾( rear ) :允许进行插入的一端称为队尾;
在空队列中依次加入元素 a1, a2, , an 之后, a1 是队首元素, an 是队尾元素。显然
退出队列的次序也只能是 a1, a2, , an ,即队列的修改是依先进先出的原则进行的,如
图所示
队列的抽象数据类型定义
ADT Queue{
        数据对象:D ={ a i |a i ElemSet, i=1, 2, , n, n >= 0 }
        数据关系:R = {<a i-1 , a i > | a i-1 , a i D, i=2,3, ,n }
                约定 a1 端为队首, a n 端为队尾。
        基本操作:
         Create ():创建一个空队列;
         EmptyQue ():若队列为空,则返回 true ,否则返回 flase
         InsertQue (x) :向队尾插入元素 x
         DeleteQue (x) :删除队首元素 x
} ADT Queue

2.顺序队列

利用一组连续的存储单元(一维数组) 依次存放从队首到队尾的各个元素,称为顺
序队列。
静态顺序队列,其类型定义如下:
#define MAX_QUEUE_SIZE 100
typedef struct{
	int data[MAX_QUEUE_SIZE];
	int front;//队首指针
	int rear;//队尾指针
}SqQueue;

约定:   front始终指向队首元素
           rear始终指向队尾元素的下一个空位置

初始化: front = rear = 0
入队:将新元素插入 rear 所指的位置,然后 rear 1
出队:删去 front 所指的元素,然后加 1 并返回被删元素。
顺序队列中存在“假溢出”现象。尽管队列中实际元素个
数可能远远小于数组大小,但可能由于尾指针巳超出向量空间
的上界而不能做入队操作。该现象称为假溢出。
为充分利用空间,克服上述“假溢出”现象的方法是:将
为队列分配的向量空间看成为一个首尾相接的圆环,并称这种
队列为循环队列
入队: rear = rear + 1 % MAX_QUEUE_SIZE
出队: front = front + 1 % MAX_QUEUE_SIZE
循环队列中元素个数: len = rear front + MAX_QUEUE_SIZE % MAX_QUEUE_SIZE
#define MAX_QUEUE_SIZE 100
typedef struct{
	int data[MAX_QUEUE_SIZE];
	int front;//队首指针
	int rear;//队尾指针
}SqQueue;

/**
 * 约定:front始终指向队首元素
 *		 rear始终指向队尾元素的下一个空位置
 */
SqQueue create_queue() {
	SqQueue queue;
	queue.front = 0;
	queue.rear = 0;
	return queue;
}

//将数据元素 e 插入到循环队列 Q 的队尾
bool insert_queue(SqQueue* q, int e) {
	//判断队列是否满
	if ((q->rear + 1) % MAX_QUEUE_SIZE == q->front) {
		return false;
	}
	q->data[q->rear] = e;
	q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
	return true;
}

//将循环队列 Q 的队首元素出队
bool delete_queue(SqQueue* q, int *e) {
	//先判断队列是否空
	if (q->rear == q->front) {
		return false;
	}
	*e = q->data[q->front];
	q->front = (q->front + 1) % MAX_QUEUE_SIZE;
	return true;
}

int delete_queue(SqQueue* q) {
	int e;
	bool ok = delete_queue(q, &e);
	return e;
}

int length(const SqQueue* q) {
	return (q->rear - q->front + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE;
}

bool empty(const SqQueue* q) {
	return q->front == q->rear;
}

bool full(const SqQueue* q) {
	return q->front == (q->rear+1)%MAX_QUEUE_SIZE;
}

void test1() {
	SqQueue q = create_queue();
	for (int i = 1; i <= 10; i++) {
		insert_queue(&q, i*2);
	}
	for (int i = 1; i <= 3; i++) {
		printf("%d,", delete_queue(&q));//2,4,6
	}
	printf("\n=============\n");
	printf("len = %d\n", length(&q));//7

	printf("\n=============\n");
	SqQueue q1 = create_queue();
	printf("empty ? %s\n", empty(&q1) ? "true" : "false");//true
	printf("full ? %s\n", full(&q1) ? "true" : "false");//false

	printf("\n=============\n");
	SqQueue q2 = create_queue();
	for (int i = 0; i < MAX_QUEUE_SIZE; i++) {
		insert_queue(&q2, i);
	}
	printf("empty ? %s\n", empty(&q2) ? "true" : "false");//false
	printf("full ? %s\n", full(&q2) ? "true" : "false");//true
}

3.链式队列

队列的链式存储结构简称为链队列,它是限制仅在表头进行删除操作和表尾进行插入
操作的单链表。
数据元素结点类型定义:
typedef struct QNode {
	int data;
	struct QNode* next;
}QNode;

typedef struct{
	QNode* front;
	QNode* rear;
}LinkQueue;
链队的操作实际上是单链表的操作,只不过是删除在表头进行,插入在表尾进行。插
入、删除时分别修改不同的指针。
typedef struct QNode {
	int data;
	struct QNode* next;
}QNode;

typedef struct{
	QNode* front;
	QNode* rear;
}LinkQueue;

/**
 * 创建结点(私有函数)
 */
QNode* node_create(int data, QNode *next) {
	QNode* node = (QNode*)malloc(sizeof(QNode));
	if (node != nullptr) {
		node->data = data;
		node->next = next;
	}
	return node;
}

/**
 * 创建链队列
 */
LinkQueue queue_create() {
	LinkQueue q;
	q.front = node_create(0, nullptr);
	q.rear = q.front;
	return q;
}

bool insert_queue(LinkQueue* q, int e) {
	if (q == nullptr || q->front == nullptr) {
		return false;
	}
	//创建结点,插入队列尾
	QNode* node = node_create(e, nullptr);
	q->rear->next = node;
	q->rear = node;
	return true;
}

bool delete_queue(LinkQueue* q, int* e) {
	if (q == nullptr || q->front == nullptr) {
		return false;
	}
	if (q->front == q->rear) {//队列为空,返回false
		return false;
	}

	QNode* p = q->front->next;
	q->front->next = p->next;
	*e = p->data;
	free(p);
	return true;
}

int delete_queue(LinkQueue* q) {
	int e;
	if (false == delete_queue(q, &e)) {
		return INT_MIN;
	}
	return e;
}

bool empty(LinkQueue* q) {
	return q->front == q->rear;
}

void test() {
	LinkQueue q = queue_create();
	for (int i = 1; i <= 10; i++) {
		insert_queue(&q, i * i);
	}
	for (int i = 1; i <= 10; i++) {
		printf("%d,", delete_queue(&q));
	}
	printf("\n=============\n");
}

4.队列应用

1. 排队买东西 、打印机服务、医院的挂号系统等等
2. 树的层次遍历
3. 图的广度优先遍历

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

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

相关文章

C/C++编程-算法学习-数字滤波器

数字滤波器 一阶低通滤波器结论推导11. 基本公式推导2. 截止频率 和 采样频率 推导 实现 二阶低通滤波器实现1实现2推导1推导2 一阶低通滤波器 结论 其基本原理基于以下公式&#xff1a; o u t p u t [ n ] α ∗ i n p u t [ n ] ( 1 − α ) ∗ o u t p u t [ n − 1 ] …

(Arxiv-2023)MobileDiffusion:移动设备上即时文本到图像生成

MobileDiffusion&#xff1a;移动设备上即时文本到图像生成 Paper Title&#xff1a;MobileDiffusion: Instant Text-to-Image Generation on Mobile Devices Paper是谷歌出品 Paper地址 图 1&#xff1a;MobileDiffusion 用于 (a) 文本到图像的生成。(b) Canny 边缘到图像、风…

认证授权概述和SpringSecurity安全框架快速入门

1. 认证授权的概述 1.1 什么是认证 进入移动互联网时代&#xff0c;大家每天都在刷手机&#xff0c;常用的软件有微信、支付宝、头条、抖音等 以微信为例说明认证的相关基本概念。在初次使用微信前需要注册成为微信用户&#xff0c;然后输入账号和密码即可登录微信&#xff0c…

完成stable将图片转换为二维码

1.创建虚拟环境 conda create -n stable python=3.10.6 2.克隆项目 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 或者 git clone https://kgithub.com/AUTOMATIC1111/stable-diffusion-webui 3.安装依赖(-i https://pypi.tuna.tsinghua.edu.cn/s…

C++基础编程100题-028 OpenJudge-1.4-08 判断一个数能否同时被3和5整除

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0104/08/ 描述 判断一个数n 能否同时被3和5整除 输入 输入一行&#xff0c;包含一个整数n。&#xff08; -1,000,000 < n < 1,000,000&#xff09; 输出 输出一行&#xff0c;如果能同时被3和5整除输…

八股文-基础知识-int和Integer有什么区别?

引言 在Java编程实践中&#xff0c;基本数据类型int与包装类Integer扮演着不可或缺的角色&#xff0c;它们间的转换与使用策略深刻影响着程序的性能与内存效率。本文旨在深入探究int与Integer的区别&#xff0c;涵盖其在内存占用、线程安全、自动装箱与拆箱机制等方面的表现。…

3条非常实用的处世“潜规则”,受益终生

01 尽量不要让别人在你身上免费得到&#xff0c;哪怕是你不需要或者根本不在意的东西。 让别人免费得到&#xff0c;其实就是一种暗示&#xff0c;暗示别人可以继续免费索取&#xff0c;为什么&#xff1f;因为人性总是趋利的&#xff0c;如果可以免费得到&#xff0c;那为什…

高校是需要AIGC 实验室还是大数据人工智能实验室呢

AIGC&#xff08;人工智能与图形计算&#xff09;实验室和大数据人工智能实验室虽然都隶属于人工智能的范畴&#xff0c;但它们的关注点、研究方向和具体应用领域有所不同。 我们分别从研发方向、技术侧重、应用领域、研究工具和方法等方面去分析两者的区别&#xff0c;希…

MySQL的跳跃式索引

Skip Index Scan&#xff08;跳跃式索引&#xff09; 例如初中有个学生表&#xff0c;年级、班级、学号 符合索引。 -- 问题是下面这个查询为什么也可以用到索引。 select * from 初中学生表 where 班级 1 and 学号 001-- 思考一下这个查询比全表扫描快吗&#xff1f; sele…

“微软蓝屏”事件:网络安全与稳定性的深刻反思

&#x1f308;所属专栏&#xff1a;【其它】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…

软件-vscode-plantUML-IDEA

文章目录 vscode基础命令 实操1. vscode实现springboot项目搭建 &#xff08;包括spring data jpa和sqlLite连接&#xff09; PlantUMLIDEA下载及安装Eval Reset插件配置修改IDEA创建项目的默认目录IDEA配置gitIDEA翻译插件translationIDEA断点调试IDEA全局搜索快捷键不能使用代…

UE5.4内容示例(3)FBX_Import_Options - 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例&#xff0c;可以用此熟悉一遍UE5的功能 FBX_Import_Options案例 导入案例需要和模型制作工具结合理解&#xff0c;这里就大致了解下都可以导入些什么内容 1.1 Stati…

基于web3区块链的名酒资产数字化、个人闲置资产收藏系统,实现联盟链、NFT数据上链、智能合约开发

系统背景&#xff1a; 国内有众多历史悠久却极具收藏价值的名酒品类&#xff0c;但是传统名酒投资存在着保真、流通和收藏三大痛点&#xff0c;极大影响了名酒产业的发展。基于区块链的分布式、不可篡改、可追溯、透明性、多方维护、交叉验证等特性&#xff0c;数据权属可以被有…

录歌用什么软件好?关于录音软件的操作介绍(内含7款)

录歌用什么软件好&#xff1f;借助录音软件&#xff0c;我们可以在电脑上录制音频文件&#xff0c;包括游戏原声、电台、视频会议、音乐平台等。 一、什么是录音软件 简单来说&#xff0c;录音软件就是一个录制声音的用户界面。这些应用程序允许用户录制任何声音、处理和混合音…

成就巴西休闲游戏如何借助Google谷歌广告投放优势

在探讨巴西休闲游戏如何借助谷歌广告投放优势实现市场扩张的过程中&#xff0c;我们不得不深入分析巴西市场的独特属性、休闲游戏的兴起背景&#xff0c;以及谷歌广告平台在全球范围内的强大影响力。近年来&#xff0c;随着移动游戏市场的快速发展&#xff0c;特别是中轻度休闲…

使用免费代理有什么危险?

一、引言 随着互联网的普及&#xff0c;越来越多的人开始意识到代理服务的重要性&#xff0c;尤其是在保护隐私和突破地域限制方面。然而&#xff0c;在众多的代理服务中&#xff0c;免费的代理服务已经成为许多人的首选。本文将深入探讨使用免费代理的危险&#xff0c;并帮助…

LeetCode Hot100 删除链表的倒数第 N 个结点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&#xff1a;…

【Unity渲染】烘培

光照探针 光照探针就是在烘焙的时候会布局多个探测点&#xff0c;记录那个地方的光照信息&#xff0c;后面实时渲染动态物体会影响其渲染&#xff0c;动态物体会选择自己周围最近的探针进行影响 反射探针 反射探针就是记录周围环境&#xff0c;计算一个类似天空盒的图片&am…

免费!OpenAI发布最新模型GPT-4o mini,取代GPT-3.5,GPT-3.5退出历史舞台?

有个小伙伴问我&#xff0c;GPT-4O mini是什么&#xff0c;当时我还一脸懵逼&#xff0c;便做了一波猜测&#xff1a; 我猜测哈&#xff0c;这个可能是ChatGPT4o的前提下&#xff0c;只支持文本功能的版本&#xff0c;速度更快 结果&#xff0c;大错特错。 让我们一起看看Open…

【QT】无法打开QT的ui文件,出现闪退情况

打开qt的ui文件出现闪退的情况&#xff1a; 解决办法&#xff1a;点击扩展-Qt VS Tools-Options 找到Qt General中的Qt Designer 的Run in detached window改为True。