【数据结构入门 】队列

news2024/9/25 17:10:13

目录

前言

一、队列的概念及结构

1.概念

2.结构

二、队列的实现

1.队列的声明

2.初始化队列

 3.队列的销毁

 4.入队

5.出队

 6.获取队列有效元素个数

7. 判断队列是否为空

8.获取队首元素

 9.获取队尾元素

结论


前言

        队列是一种数据结构,它遵循先进先出(FIFO)的原则。这意味着最先进入队列的元素将最先被处理或移除,而最后进入队列的元素将最后被处理或移除。

        队列的基本操作包括入队(向队列尾部添加元素)出队(从队列头部移除元素)

一、队列的概念及结构

1.概念

队列是一种具有先进先出(FIFO)特性的数据结构。它类似于在超市排队购物时的情景,新来的人只能排在队尾,而离开队伍的人是从队首开始。在队列中,元素按照插入的顺序排列,并且只能在队尾添加新元素,而只能在队首删除元素。这使得队列成为处理按照先后顺序排列的数据的理想选择。

队列有两个主要操作:入队(enqueue)和出队(dequeue)。入队操作将元素添加到队尾,出队操作将队首的元素删除并返回。除此之外,队列还可以支持其他操作,如获取队首元素、判断队列是否为空等。

队列在计算机科学中广泛应用,例如任务调度、消息传递、缓冲区管理等领域。在编程中,队列通常使用数组或链表来实现。

2.结构

二、队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。

1.队列的声明

使用链表结构,要返回多个参数,所以使用结构体封装。

 

typedef int QDataType;

typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
}Queue;

2.初始化队列

 

void QueueInit(Queue* pq)
{
	assert(pq);

	pq->head = pq->tail = NULL;
	pq->size = 0;
}

 3.队列的销毁

void QueueDestory(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

 4.入队

void QueuePush(Queue* pq, QDataType x)
{
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;

	//没有结点插入时
	if (pq->head == NULL)
	{
		assert(pq->tail == NULL);

		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	pq->size++;
}

5.出队

void QueuePop(Queue* pq)
{
	assert(pq && pq->head);
	
	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		QNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
	}
	pq->size--;
}

 6.获取队列有效元素个数

int QueueSize(Queue* pq)
{
	assert(pq);
	
	return pq->size;
}

7. 判断队列是否为空

bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->size == 0;
}

8.获取队首元素

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->head->data;
}

 9.获取队尾元素

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->tail->data;
}

结论

队列和栈的区别:

  1. 数据操作方式:队列是先进先出,栈是后进先出。
  2. 插入和删除操作:队列的插入操作是在队尾进行,删除操作是在队头进行;栈的插入和删除操作都是在栈顶进行。
  3. 访问限制:队列只能访问队头和队尾元素,不能访问队列中间的元素;栈只能访问栈顶元素。
  4. 应用场景:队列常用于需要按顺序处理数据的场景,如任务调度、消息队列等;栈常用于需要后进先出的场景,如表达式求值、函数调用等。

在实际应用中,队列和栈经常结合使用,例如使用栈来实现队列,或者使用队列来实现栈。它们是解决问题的重要工具,根据具体的场景和需求选择合适的数据结构是很重要的。

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

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

相关文章

数字与位操作——168、670、233、357、400

168. Excel表列名称(简单) 给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...示例 1: 输入:columnNumb…

[NISACTF 2022]ezstack-入土为安的第十四天

签到题吧 checksec pwn 没有保护 进入main函数,点进shell ,buf 88808048buf system 08048512 /bin/sh 0804A024 直接让代码溢出调用system和/bin/sh from pwn import *# 连接到远程服务 p remote(node5.anna.nssctf.cn, 20789)# 构造 payload payl…

第三期书生大模型实战营之Llamaindex RAG实践

基础任务 任务要求:基于 LlamaIndex 构建自己的 RAG 知识库,寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答,借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力,截图保存。 streamlit界面…

OS_进程

2024.06.25:操作系统进程学习笔记 第6节 进程 6.1 进程的定义6.2 进程的基本特征(动态、并发、独立、异步)6.3 机器状态(进程可以读取/更新的内容)6.3.1 虚拟化技术6.3.2 进程的地址空间(虚拟存储器技术要学…

基于OpenCV-Python的彩色图像傅里叶变换

如果用OpenCV-Python进行图像的离散傅里叶变换与逆变换其实还蛮简单的,流程就是上图所示,值得注意的是,如果是多通道的图像,譬如多光谱、高光谱图像,需要对每个通道都进行傅里叶变换,最后再聚合&#xff0c…

数字乡村 | 是什么、建什么、怎么建?附200份详尽解决方案下载

数字乡村是什么 如何将数字乡村建设与全面实施乡村振兴战略有效衔接,已成为当前农业农村工作的重要课题。 200份资料下载方式,请看每张图片右下角信息 数字乡村作为一种新的乡村社会发展形态,是当今第四次工业革命工业互联网 生态系统的持…

如何在Java中调用数学中的log函数

在Java中,调用数学中的对数(log)函数通常是通过Math类来实现的。Math类提供了多种对数函数的实现,但最常用的是自然对数(底数为e的对数)和以10为底的对数。 自然对数(底数为e) 使用…

深度学习之参数初始化问题

参数初始化 1、 参数初始化可以减缓梯度爆炸和梯度消失问题 2、tanh一般使用Xavier初始化方法 3、Relu及其变种使用Kaiming初始化方法 V a r ( X ) E ( X 2 ) − E ( X ) 2 V a r ( X Y ) V a r ( X ) V a r ( Y ) , 当 X 和 Y 互相独立 V a r ( X Y ) V a r ( X ) V a r…

【机器学习基础】Scikit-learn主要用法

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…

C语言 ——— 学习、使用 strstr函数 并模拟实现

目录 strstr函数的功能 学习strstr函数​编辑 使用strstr函数 模拟实现strstr函数 strstr函数的功能 在字符串 str1 中找 str2 字符串,如果在 str1 字符串中找到了 str2 字符串,就返回 str1 中找到的 dtr2 的地址,没找到的话就返回 NU…

[CR]厚云填补_MSDA-CR

Cloud Removal in Optical Remote Sensing Imagery Using Multiscale Distortion-Aware Networks Abstract 云层污染是光学遥感图像中常见的问题。基于深度学习的遥感图像去云技术近年来受到越来越多的关注。然而,由于缺乏对云失真效果的有效建模和网络较弱的特征表…

EasyMR如何为服务开启Kerberos

作者:雅泽 一、Hadoop为什么需要安全 最早部署Hadoop集群时并没有考虑安全问题,未开启安全认证时,Hadoop 是以客户端提供的用户名作为用户凭证, 一般即是发起任务的Unix 用户。一般线上机器部署服务会采用统一账号,当…

CPU与Load

1、CPU和LOAD分别是什么load就是负载吗,跟CPU啥关系,啥区别 CPU和Load(负载)是衡量计算机系统性能的两个重要指标,但它们关注的侧重点和意义不同。理解这两个指标及它们之间的关系对于系统优化和性能监控非常重要。 CP…

【C++】数组案例 五只小猪称体重

题目:给出物质小猪体重,找出最大的体重的值并打印 思路:利用菽粟写入五只小猪的体重,让每一个元素都赋值给一个整型变量并每赋值一次就于下一个数组中的元素比,若是大就继续赋值给这个变量,若是小则不赋值…

【QT】qss

目录 基本语法 设置全局样式 问题 分离样式代码 方案1 方案2 选择器 概况 子控件选择器 伪类选择器 盒子模型 修改控件样式示例 按钮 属性小结 复选框 属性小结 输入框 属性小结 列表框 属性小结 渐变色 示例: 菜单栏 设置菜单栏的背景…

clang 编译cuda原理

背景 最近在看一门julia的语言,里面是原生支持cuda的,不过在国产卡上却无法适配,为了开展工作有必要了解非常清楚整个编译的机制。此外在研究过程中发现openai 的triton,以及tvm等一些ai框架对nvidia的支持原理都及其类似&#x…

LinkedList接口源码解读

LinkedList 接口源码解读(一) 前言 因为追求质量,所以写的较慢。大概在接下来的三天内会把LinkedList源码解析出完。大概还有两篇文章。废话不多说,正片开始! 大家都知道,LinkedList是在Java底层中是由 …

【C++标准模版库】模拟实现vector+迭代器失效问题

模拟实现vector 一.vector成员变量二.构造函数1.无参(默认)构造2.有参构造3.拷贝构造1.传统写法2.现代写法 三.vector对象的容量操作1.size2.capacity3.clear4.empty5.reserve6.resize 四.vector对象的访问及遍历操作1.operator[]2.实现迭代器&#xff1…

一次Linux端口冲突问题排查记录

更多技术博客,请关注微信公众号:运维之美 一、问题现象 实施同学反馈说我们的服务部署到客户环境后,运行正常,但是后台页面就是无法打开,出现访问白屏问题 从console报错看是其中一个接口响应存在问题,…

老兵永远跟党走,团结奋进新征程-百余老兵庆八一暨《永远闪光的军徽》新书发布座谈会在昆举行

7月30日上午,由中国红色文化研究会老山精神专业委员会主办,昆明乡羊香园承办的百余老兵庆祝“八一”建军节暨《永远闪光的军徽》新书发布座谈会在昆明滇池湖畔乡羊香园举行。 上午10时左右,老战士、曾担任云南省军区领导的黄光汉、陶昌廉、和志光、李继才、雷玉德、王永银老将军…