数据结构学习之队列

news2024/11/27 21:31:50

前言:在我们学习了栈之后,明白了它的结构的特殊性即LAST IN FIRST OUT(后进先出),与之相对应的也有一个特殊的结构队列(queue)--FIRST IN FIRST OUT(先进先出),他们都是面对特殊情况下的数据的结构,那么队列有是如何实现的呢,是用来干嘛的呢?

目录

1.什么是队列?

2.队列的实现

1.结构体与函数接口

2.初始化队列

3.销毁队列

4.入队

5.出队

6.返回队头

7.返回队尾

8.返回长度

9.判空队列

注意事项

3.队列的用处


1.什么是队列?

队列是一种先进先出的、操作受限的线性表。它的想法来自于生活中排队的策略,先来的元素先出去,后来的元素后出去。队列可以用数组或链表来实现,也有循环队列和优先队列等特殊类型,考虑到队列的先进先出的特点,即数据的头删尾插,我们选择用链表来实现队列,这里选用单链表即可。

队列的模型图:

 日常生活中我们排队在餐厅门口处取餐,挂号都是一种队列的模型。

2.队列的实现

1.结构体与函数接口

和栈相反,对于队列因为只允许操作队头与队尾,我们除了创建单链表的结构体外,还创建了一个结构体表示队列,包含队头节点,队尾节点,以及队长,故这里的单链表结构体相当于是为我们提供节点,实现队列是在此基础上的该队列结构体。

其次便是实现的一些基本功能的接口。队列的实现整体较为简单,我们这里还是以存放整数为例。

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
typedef int queDATAtype;
typedef struct Queuenode
{
	struct Queuenode* next;
	queDATAtype data;
}QUE;

 typedef struct QUEue
{
	QUE* front;
	QUE* tail;
	int size;
}LTnode;

void Queueinit(LTnode* p);//初始化队列
void Queuedestroy(LTnode* p);//销毁队列
void LTpush(LTnode* p,int x);//尾插
void LTpop(LTnode* p);//头删
int  LTfront(LTnode* p);//返回队头
int  LTtail(LTnode* p);//返回队尾
int LTsize(LTnode* p);//返回队长
bool LTempety(LTnode* p);//判空队

2.初始化队列

初始化队列很简单,即我们的队头与队尾此时皆为空,长度为零。

//初始化
void Queueinit(LTnode* p)
{
	assert(p);
	p->front = NULL;
	p->tail = NULL;
	p->size = 0;
}

3.销毁队列

即从头开始遍历队列,不为空则释放,然后指向下一节点,(与头删一样,我们先保存下一节点,在释放)直到头尾节点皆被释放,之后置空,长度归零。

void Queuedestroy(LTnode* p)
{
	assert(p);
	QUE* cur = p->front;
	while (cur)
	{
		QUE* next =cur->next;
		free(cur);;
		cur = next;
	}
	p->front = p->tail = NULL;
	p->size = 0;
}

4.入队

入队即尾插,因为这里是无哨兵位的单链表,因此在判空队列之后,我们先开辟出节点空间并初始化为要插入的节点,然后再判断若为空节点,即没有元素,那么队头节点与队尾节点相等并为该插入的新节点,否则,就是尾插--与单链表操作类似,链接尾节点的next,之后成为新的尾节点。插入之后,记得队长加一。

void LTpush(LTnode* p, int x)
{
	QUE*newnode=(QUE*)malloc(sizeof(QUE));
	if (newnode == NULL)
	{
		return;
		perror("malloc fail");
	}
	assert(p);
	newnode->next = NULL;
	newnode->data = x;
	if (p->front ==NULL )
	{
		assert(p->tail==NULL);
		p->front = p->tail = newnode;
		p->size++;
	}
	else
	{
		p->tail->next = newnode;
		p->tail = newnode;
		p->size++;
	}

}

5.出队

出队,即头删,因此我们先判空队列之后,在判断是否有元素,即头尾指针不同时为零。头删时要分两种情况:1.只有一个元素时头删,这时我们要将头尾指针同时free置空。2.多个元素头删,保存头结点的下一个,free头节点,成为新的头节点。

void LTpop(LTnode* p)//头删
{
	assert(p);
	assert(!LTempety(p));
	if (p->front ->next==NULL)
	{
		free(p->front);
		p->front = NULL;
		p->tail = NULL;
	}
	else
	{
        QUE* cur = p->front->next; 
	    free(p->front);
	    p->front = cur;
	   
	}
	 p->size--;
}

以下四个操作较为简单,不做表述:

6.返回队头

int LTfront(LTnode* p)
{
	assert(p);
	assert(!LTempety(p));
	return p->front->data;
}

7.返回队尾

int  LTtail(LTnode* p)
{
	assert(p);
	return p->tail->data;
}

8.返回长度

int LTsize(LTnode* p)
{
	assert(p);
	return p->size;
}

9.判空队列

bool LTempety(LTnode* p)
{
	assert(p);
	return p->size == 0;
}

注意事项

 这里需要注意的一点是,我们一般是不会对栈与队列的某个元素进行访问,必须遵循该结构对数据的操作方式,即数据只能先进先出。我们遍历数据也是如此:

int main()
{
	LTnode n;
	Queueinit(&n);
	LTpush(&n, 1);
	LTpush(&n, 2);
	LTpush(&n, 3);
	while (!LTempety(&n))
	{
		printf("%d ", LTfront(&n));
		LTpop(&n);
	}
	Queuedestroy(&n);
	return 0;
}

3.队列的用处

队列结构下的应用是指利用队列的特点来解决一些实际问题或算法问题。例如:

1.队列可以用来模拟排队等待的场景。

2.也可以用来实现广度优先搜索算法。

3.可以用来设计一些特殊的队列,如单调队列、优先队列等,来处理区间最值、滑动窗口等问题。

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

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

相关文章

支持导入 Postman ,用这个插件就可以了

首先安装 导入 Postcat 插件&#xff0c;之后就可以愉快的导入 Postman 格式的文件了。 右上角——选择导入——选择Postman 格式——拖入文件 导入即可&#xff01;再也不用担心 Postcat 格式的 api 文件能把自己难住了&#xff01; 如果你日常会用到 api 管理工具的话&#x…

5G和物联网将如何重塑汽车行业?物联网将给汽车行业带来哪些变革?

“ 物联网(Internet of Things)的诞生给无数行业带来了变革&#xff0c;其中就包括汽车行业。物联网对于汽车发展的重要性是毋庸置疑的。从网联汽车到智能交通系统&#xff0c;物联网正在为汽车行业开辟下一个汽车时代。汽联网(Internet of Vehicles)正在成型。” 我们今天看到…

k8s部署mysql并使用nfs持久化数据

k8s部署mysql并使用nfs持久化数据 一、配置nfs服务器1.1 修改配置文件1.2. 载入配置1.3. 检查服务配置 二、创建K8S资源文件2.1 mysql-deployment.yml2.2 mysql-svc.yml 一、配置nfs服务器 参考文章: pod使用示例https://cloud.tencent.com/developer/article/1914388nfs配置…

管好【SD-WEBUI】中大量的模型:名称+预览图+备注+分组(Part.2)

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;模型预览图&#xff08;1.1&#xff09;预览图姿态&#xff08;证件照&#xff09;&#xff08;1.2&#xff09;预览图姿态&#xff08;半身动作&#xff09; &#xff08;二&#xff09;LoRA模型名称&#…

机器人关节电机PWM

脉冲宽度调制(Pulse width modulation,PWM)技术。一种模拟控制方式 机器人关节电机的控制通常使用PWM(脉冲宽度调制)技术。PWM是一种用于控制电子设备的技术,通过控制高电平和低电平之间的时间比例,实现对电子设备的控制。在机器人关节电机中,PWM信号可以控制电机的…

C++ | 高效使用vector

C | 高效使用vector 文章目录 C | 高效使用vector1.善用Reserve2.移动构造和赋值3.释放vector如果vector内存的是指针&#xff0c;需要先释放每个指针所指内存&#xff0c;再释放vectorReference 1.善用Reserve 当需要向vector中添加元素但目前的空间已经放满时&#xff0c;ve…

200G AOC有源光缆在数据中心的应用

随着大数据时代对高速、高带宽的需求日益增长&#xff0c;人们迫切需要一种新型产品作为高性能计算和数据中心的主要传输介质。因此&#xff0c;光通信传输速率的发展也提高了。面对短距离数据中心在光互连产品中的高速、高密度、低成本、低功耗要求&#xff0c;AOC有源光缆提供…

shell脚本----awk命令

文章目录 一、awk工作原理二、awk相关命令三、awk的使用按行输出文本:按字段输出文本&#xff1a;通过管道、双引号调用 Shell 命令&#xff1a; 一、awk工作原理 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中…

Flink Kafka-Source

文章目录 Kafka Source1. 使用方法2. Topic / Partition 订阅3. 消息解析4. 起始消费位点5. 有界 / 无界模式6. 其他属性7. 动态分区检查8. 事件时间和水印9. 空闲10. 消费位点提交11. 监控12. 安全 Apache Kafka 连接器 Flink 提供了 Apache Kafka 连接器使用精确一次&#xf…

由浅入深理解java集合(四)——集合 Queue

Queue用于模拟队列这种数据结构&#xff0c;队列通常是指“先进先出”&#xff08;FIFO&#xff09;的容器。新元素插入&#xff08;offer&#xff09;到队列的尾部&#xff0c;访问元素&#xff08;poll&#xff09;操作会返回队列头部的元素。通常&#xff0c;队列不允许随机…

【C++初阶】类与对象(中)之构造函数与析构函数

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

C++继承详解——基类派生类对象赋值转换、菱形虚拟继承

hello&#xff0c;这里是bangbang&#xff0c;今天来讲下继承。 面向对象三大特性&#xff1a;封装、继承、多态。 目录 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承关系和访问限定符 1.2.3 继承基类成员访问方式的变化 2. 基类和派生类对…

Java面试知识点(全)-设计模式二

Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 13.模板模式 定义一个操作中算法的骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变算法的结构即可重定义该算法的…

7. 深入理解MVCC与BufferPool缓存机制

MySQL性能调优 1. MVCC多版本并发控制机制1.1 undo日志版本链与read view机制详解 2. Innodb引擎SQL执行的BufferPool缓存机制 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 本节课内容&#xff1a; 1、…

PowerShell install 一键部署VMware_Workstation

VMware Workstation 前言 VMware Workstation Pro 是业界标准的桌面 Hypervisor&#xff0c;用于在 Linux 或 Windows PC 上运行虚拟机 download VMware_Workstation VMware_Workstation WindowsVMware_Workstation linux文档downloaddownload参考 前提条件 开启wmi,配置…

2023接口自动化测试框架9项必备功能(建议收藏)

当你准备使用一个接口测试框架或者自造轮子的时候&#xff0c;或许你需要先了解下一个接口自动化测试框架必须具备什么功能。 一、校验 这个很好了解&#xff0c;如果没有校验&#xff0c;单纯的执行接口的话&#xff0c;那就谈不上测试了。所以支持对返回值校验是一个必须的…

【集合详解】——python基础——如桃花来

目录索引 集合的特点&#xff1a;创建集合&#xff1a;集合常见操作&#xff1a;增加数据&#xff1a;*add():**update():* 删除数据&#xff1a;*remove():**discard():**pop():* 查找数据&#xff1a;*in:**not in:* 集合的特点&#xff1a; 没有重复元素,即使重复&#xff0…

【ONE·C++ || set和map(三):基于红黑树的封装框架】

总言 主要介绍map、set的封装框架。 文章目录 总言1、基本框架说明2、map、set封装Ⅰ&#xff1a;用于比较的仿函数3、map、set封装Ⅱ&#xff1a;迭代器实现3.1、基本说明3.2、begin()、end()、operator*、operator&、operator、operator!3.2.1、begin()、end()3.2.2、op…

( 位运算 ) 693. 交替位二进制数 / 476. 数字的补数 ——【Leetcode每日一题】

❓ 题目一 693. 交替位二进制数 难度&#xff1a;简单 给定一个正整数&#xff0c;检查它的二进制表示是否总是 0、1 交替出现&#xff1a;换句话说&#xff0c;就是二进制表示中相邻两位的数字永不相同。 示例 1&#xff1a; 输入&#xff1a;n 5 输出&#xff1a;true 解…

使用inbuilder完成UBML低代码设计

文章目录 一、活动介绍二、我所认识的低代码平台三、使用inbuilder开发工具拖拉跩实现 低代码产品开发四、环境搭建五、5分钟完成低代码实验六、财务报销报表实验活动成果截图七、总结 一、活动介绍 开放原子训练营开启inBuilder低代码实验室活动。无论您是计算机行业相关从业…