【数据结构】队列及其实现

news2025/1/20 5:51:47

目录

😎前言

认识队列

队列的初始化

队列判空

数据队尾入队

数据队头出队

取队头数据

取队尾数据

队列数据的个数

队列销毁

总结


😎前言

  • 上次我们学习了栈及其实现,当然也少不它的好兄弟队列啦,今天我们开始队列的学习
  • 队列的性质是先进先出,就比如车辆进出隧道一般,它也是一种逻辑结构,依靠数组或者链表实现
  • 在一些算法题我们也会运用到队列的进一步思想——优先队列(由二叉树实现),等到二叉树章节会给大家讲解的。

认识队列

队列和栈一样都是逻辑结构——由数组或者链表加以限制条件而成的,它的逻辑是先入先出,所以入数据是从队尾入,出数据就是从队头出

常见的应用就是银行的取号机,防止有人插队

可以发现如果用数组模拟队列的话,出队的时候就要频繁移动数组内的数据,不是很方便,也要考虑到扩容的问题,所以本篇选取链表的形式来实现队列

队列的初始化

队列本质上就是一个单链表,单链表又是由一个个节点组成,所以自然而然我们要先定义它的结点

typedef struct QNode
{
	struct QNode* next;
	QDataType val;
}QNode;
  • 队列还需要一个指针指向它的队头,一个指针指向队尾,还有一个变量记录存储的数据的个数
  • 所以此处可以选择再用一个结构体对其进行封装,这样操作起来就会简单许多

 上图就是队列的基本框架了

typedef struct Queue
{
	QNode* front;
	QNode* rear;
	int size;
}Queue;

有了基本结构,那么首先肯定还是对其就行初始化,这里只需要将两个指针都置空,size置0即可

老生常谈的问题,对于函数接口接受的队列来说不能为空,否则就相当于传了一个还没建立好的队列进去,直接assert断言暴打,这是每个函数接口都要用到的,下文就不赘述了

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

	q->front = q->rear = NULL;
	q->size = 0;
}

队列判空

  • 在取数据以及数据出队的时候,往往需要对队列进行判空操作,所以我们先将其封装成一个函数接口
  • 可以提高代码的可读性
  • size及表示存储的数据个数,所以我们返回size==0这个条件判断表达式即可

以下为函数接口实现:

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
bool QueueEmpty(Queue* q)
{
	assert(q);

	return q->size == 0;
}

数据队尾入队

  • 因为队列是不带头单向不循环链表,队尾入队就是给单链表尾插结点,所以链表学的扎实的同学应该可以反应过来这里需要分类讨论一下
  • 一是队列为空的时候,这个时候插入数据就要改变front和rear指针的指向
  • 二是链表不为空的时候,这个时候只需要改变front指针的指向
  • 先malloc出新结点再进行插入操作
  • size记得++

以下为函数接口实现:

void QueuePush(Queue* q, QDataType data)
{
	assert(q);

	QNode* newnode=(QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail\n");
		return;
	}
	newnode->next = NULL;
	newnode->val = data;

	if (q->rear == NULL)
	{
		assert(q->front==NULL);
		q->front = q->rear = newnode;
	}
	else
	{
		q->rear->next = newnode;
		q->rear = newnode;
	}
	q->size++;
}

数据队头出队

  • 和队尾入队一样,此处仍需要分类讨论
  • 一是普通情况,队头出队就是头删,先记录front的下一个结点next,然后free掉front指针指向的内存空间,然后再将next赋给front
  • 二是只剩一个结点的时候,因为我们值移动front指针,所以操作完rear指针会依然指向被释放的那块空间,就存在野指针的问题
  • 记得size需要--

以下为函数接口实现:

// 队头出队列 
void QueuePop(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	//只有一个结点
	if (q->front->next == NULL)
	{
		free(q->front);
		q->front = q->rear = NULL;
	}
	else
	{
		QNode* next = q->front->next;
		free(q->front);
		q->front = next;
	}
	q->size--;
}

取队头数据

  • 如果队列为空,那么就不能返回数据,所以需要assert断言一下,这里也就用到了QueueEmpty函数接口啦
  • 返回的是结点里存储的数据的值,所以函数返回类型是QDataType,不要思维固化地认为是int
  • 返回front->val即可

以下为函数接口实现:

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

	return q->front->val;
}

取队尾数据

  • 如果队列为空,那么就不能返回数据,所以需要assert断言一下,这里也就用到了QueueEmpty函数接口啦
  • 返回的是结点里存储的数据的值,所以函数返回类型是QDataType,不要思维固化地认为是int
  • 返回rear->val即可

以下为函数接口实现:

// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	return q->rear->val;
}

队列数据的个数

上文提到了size代表存储的数据的个数,这里直接返回size即可

以下为函数接口实现:

// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{
	assert(q);

	return q->size;
}

队列销毁

  • 本质上也就是单链表的销毁,在free掉一个结点前应该先记录其下一个结点
  • 最后的front和rear指针置空,size置0

以下为函数接口实现:

void QueueDestroy(Queue* q)
{
	assert(q);

	QNode* cur = q->front;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	q->front = q->rear = NULL;
	q->size = 0;
}

总结

👉队列和栈的定义不太相同,用到了两个结构体,这也体现了在数据结构学习的时候需要一些灵活性

🫡只要之前的数据结构都好好实现了,相信队列实现起来也是洒洒水的事情啦

❤️我也会继续输出数据结构相关的博客的,希望大家多多支持!!!

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

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

相关文章

大模型Founation Model

一、背景 自从chatgpt,gpt4以特别好的效果冲入人们的视野中,也使得AI产业发生了巨大变革,从17年以来的bert,将AI的各种领域都引入bert类的fine-tune方法,来解决单个领域单个任务的一一个预训练模型。在学术界和工业界…

Redis---事务管道

目录 一、Redis的事务是什么? 1.1 Redis和关系型数据库事务的区别 二、怎么玩Redis事务? 2.1 正常执行: 2.2 放弃事务 2.3 全体连坐 2.4 冤头债主 2.5 watch监控 三、管道 3.1 为什么会引入管道这个概念呢?我们首先来看一…

前后端分离项目部署上线流程-和错误解决

需求:就是想把自己写的前后端项目传上去不再是只有本地可以访问,其他人也可以访问我这个项目,以此记录免得后面搞忘了,文章很长,也很细,我自己上线碰到的错误也会发一下,建议看完哦 1.首先买个…

U盘连接电脑不显示怎么办?

对于很多Windows 11/10/8/7系统下的用户,U 盘、SD卡或其他移动硬盘未检测到或磁盘管理中不显示,这是一个非常普遍的问题。下面我们就来了解一下出现这种情况的常见原因和解决办法。 为什么U盘没有显示在磁盘管理中? U盘在电脑磁盘管理中不显…

GPT专业应用:生成实习报告

正文共 1070 字,阅读大约需要 4 分钟 大学生必备技巧,您将在4分钟后获得以下超能力: 快速生成实习报告 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由…

旅游网站设计方案

针对涉旅企业的旅游网站设计,主要要考虑以下几点: 1、考虑网站的业务开展需求,能够有效将衣、食、住、行、游、购、娱融合在一起,满足旅游企业的业务开展需求。 2、网站的设计结构,符合目前的网站开发结构,…

vue3鼠标经过显示按钮

在前端开发中,我们经常需要在页面中添加一些交互效果来提升用户体验。其中一个常见的需求就是鼠标经过某个元素时显示一个按钮,这个按钮可以用于触发一些操作或者显示更多的内容。 在本篇文章中,我将会介绍如何使用 Vue3 实现一个鼠标经过显…

七人拼团系统开发模式常见问题详解

七人拼团模式最近在市场上非常火爆,很多企业商家都在用这个模式。但同时也有很多人对这个模式不太了解,纷纷私信问我,今天就在这里简单说一下七人拼团模式的常见问题。 1、什么是七人拼团? 七人拼团就是用户购买专区礼包后&#…

Redis的数据类型

参考文档:https://www.runoob.com/redis/redis-tutorial.html redis当中一共支持五种数据类型,分别是: string字符串 list列表 set集合 hash表 zset有序集合 1、对字符串string的操作 下表列出了常用的 redis 字符串命令 1 设置值 获取…

报错:To install it, you can run : npm install --save @api/***解决方法

启动项目时,控制台报错,在此记录一下 以下是报错原因: 报错信息如下 To install it, you can run: npm install --save /api/tNursingStaffCirculation Proxy error: Could not proxy request auth/code from localhost:8013 to http://local. See ht…

【下载】【you-get】用电脑下载网页视频

分享一下,此方法是在网络上看到的,但忘了出处。 一、前提 电脑安装了python软件,版本无要求。建议上官网下载软件。记得配置好环境(将pyhton的scripts文件夹的路径加到用户变量里)。 二、方法 1、安装you-get库 &am…

本周精彩!关于 Linux 内核宕机和超融合 Kata 虚拟化容器技术介绍 | 第 77-78 期

本周「龙蜥大讲堂」预告来啦!我们邀请了系统运维 SIG Contributor 刘馨蔚分享《Linux 内核宕机介绍和简单分析思路》,浪潮数据超融合云原生工程师王永超分享《超融合产品中的 Kata Containers》主题演讲,精彩多多,快来扫码入群&am…

linux0.12-9-1-总体功能

[395页] 9-1 总体功能 对硬盘和软盘块设备上数据的读写操作是通过中断程序进行的。内核每次读写的数据量以一个逻辑块(1024字节)为单位,而块设备控制器则是以扇区(512字节)为单位。在处理过程中,使用了读写请求项等待队列来顺序缓冲一次读写多个逻辑块…

测试用例常见的几种设计方法

我们将从以下几种常见的方法入手,讲解测试用例的设计方法: 基于需求的设计方法、等价类、边界值、因果图、正交排列、场景设计法、错误猜测法。 1.测试用例的基本要素 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一…

Android中AIDL的简单使用(Hello world)

AIDL:Android Interface Definition Language(Android接口定义语言) 作用:跨进程通讯。如A应用调用B应用提供的接口 代码实现过程简述: A应用创建aidl接口,并且创建一个Service来实现这个接口&#xff08…

使用阿里云服务器

一、购买阿里云服务器(如果是学生可以免费体验几个月) 二、开启安全组: (开启安全组): 现在这台服务器是专用网络的,那这边的网卡类型的话就内网。如果您是一个经典网络的服务器,那…

_fs.readFileSync is not a function

背景 项目需要通过读取本地一个 xlsx 的可配置文件,并生成 json 格式的文件。 查找资料发现 js 的 xlsx 库可以对 xlsx 文件进行读写和格式转换的操作,也看到了几篇xlsx结合elementui处理文件的博文,于是写下了如下代码,结果报错…

Servlet技术及代码实现

Servlet概念 Servlet是JavaEE规范之一,规范指的就是接口。Servlet是JavaWeb三大组件之一,三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。Servlet是运行在服务器上的一个java小程序,它可以接收客户端发送过来的请求&#xff0c…

5个设计师都在用的在线网页设计编辑器!

在当今的设计领域,选择一款适合的在线网页设计编辑器对于产设研团队来说至关重要。有许多选择可供考虑,其中包括即时设计、Axure RP、Adobe Illustrator、Sketch 和 Figma 等工具。在这些选择中,即时设计是一款备受推荐的在线网页设计编辑器。…

搭建免费的文件自动同步服务器,无公网IP外网远程访问【Syncthing私人云盘】

文章目录 1. 前言2. Syncthing网站搭建2.1 Syncthing下载和安装2.2 Syncthing网页测试2.3 注册安装cpolar内网穿透 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDN远程穿透的文章:Syncthing文件同步 - 免费搭建开源的文件…