【数据结构】实现队列

news2024/12/24 11:29:16

大家好,我是苏貝,本篇博客带大家了解队列,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • 一. 队列的概念及结构
  • 二. 队列的实现
    • 队列的结构体
    • 初始化
    • 销毁
    • 队尾插入
    • 队头删除
    • 显示第一个节点的值
    • 显示最后一个节点的值
    • 是否为空
    • 队列的大小
  • 三. 模块化代码实现
    • Queue.h
    • Queue.c
    • Test.c
    • 结果演示

一. 队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的性质。FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头

在这里插入图片描述


二. 队列的实现

1

队列的结构体

因为数组在头删的时候不方便,所以我们采用单链表来实现。

typedef int QDataType;

typedef struct QueueNode
{
	struct Queue* next;
	QDataType val;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;

2

初始化

因为我们要对队列进行初始化,所以实参要传Queue类型变量的地址,用一级指针来接收。因为实参(Queue类型变量的地址)不可能为NULL,所以对它断言(下面的接口同理)。

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

	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

3

销毁

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

	while (pq->phead)
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->ptail = NULL;
	pq->size = 0;
}

4

队尾插入

插入前要创建一个新节点,插入时还要判断队列是否为空,若为空则让pq->phead = pq->ptail = newnode。若不为空则只让pq->ptail ->next= newnode,再pq->ptail=pq->ptail->next
注意不要忘记pq->size++

void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);

	//创建一个新节点
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->val = x;
	newnode->next = NULL;

	//插入
	if (pq->phead == NULL)
	{
		pq->ptail = pq->phead = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}

5

队头删除

删除时要保证队列里有元素,所以对pq->phead断言,下面的显示第一个/最后一个节点的值同理
注意:当队列里只有一个元素时,删除后pq->phead指向NULL没错,但是此时pq->ptail是野指针,所以也要将pq->ptail置为NULL。不要忘记pq->size- -

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->phead);

	Queue* next = pq->phead->next;
	free(pq->phead);
	pq->phead = next;

	if (pq->phead == NULL)
	{
		pq->ptail = NULL;
	}
	pq->size--;
}

6

显示第一个节点的值

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->phead);

	return pq->phead->val;
}

7

显示最后一个节点的值

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->phead);

	return pq->ptail->val;
}

8

是否为空

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

	return pq->phead == NULL;
}

9

队列的大小

int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

三. 模块化代码实现

Queue.h

#include<stdio.h>
#include<assert.h>
#include<stdbool.h>


typedef int QDataType;

typedef struct QueueNode
{
	struct Queue* next;
	QDataType val;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;


//初始化
void QueueInit(Queue* pq);
//销毁
void QueueDestroy(Queue* pq);
//队尾插入
void QueuePush(Queue* pq, QDataType x);
//队头删除
void QueuePop(Queue* pq);
//显示第一个节点的值
QDataType QueueFront(Queue* pq);
//显示最后一个节点的值
QDataType QueueBack(Queue* pq);
//是否为空
bool QueueEmpty(Queue* pq);
//队列的大小
int QueueSize(Queue* pq);

Queue.c

#include"Queue.h"

//初始化
void QueueInit(Queue* pq)
{
	assert(pq);

	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

//销毁
void QueueDestroy(Queue* pq)
{
	assert(pq);

	while (pq->phead)
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->ptail = NULL;
	pq->size = 0;
}

//队尾插入
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);

	//创建一个新节点
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->val = x;
	newnode->next = NULL;

	//插入
	if (pq->phead == NULL)
	{
		pq->ptail = pq->phead = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}

//队头删除
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->phead);

	Queue* next = pq->phead->next;
	free(pq->phead);
	pq->phead = next;

	if (pq->phead == NULL)
	{
		pq->ptail = NULL;
	}
	pq->size--;
}

//显示第一个节点的值
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->phead);

	return pq->phead->val;
}

//显示最后一个节点的值
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->phead);

	return pq->ptail->val;
}

//是否为空
bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->phead == NULL;
}

//队列的大小
int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

Test.c

#include"Queue.h"


int main()
{
	Queue p;
	QueueInit(&p);
	QueuePush(&p, 1);
	QueuePush(&p, 2);
	QueuePush(&p, 3);
	QueuePush(&p, 4);
	QueuePush(&p, 5);
	while (!QueueEmpty(&p))
	{
		printf("%d ", QueueFront(&p));
		QueuePop(&p);
	}
	QueueDestroy(&p);
	return 0;
}

结果演示

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

盘点Java爬虫框架

盘点Java爬虫框架 Java 爬虫框架提供了许多功能丰富的工具和库&#xff0c;用于从网页抓取数据、解析HTML、处理HTTP请求等任务。以下是一些常用的 Java 爬虫框架&#xff1a; 1. **Jsoup**&#xff1a; - Jsoup 是一个用于解析HTML的Java库&#xff0c;它提供了简洁的API&am…

python自学3

第一节第六章 数据的列表 列表也是支持嵌套的 列表的下标索引 反向也可以 嵌套也可以 列表的常用操作 什么是列表的方法 学习到的第一个方法&#xff0c;index&#xff0c;查询元素在列表中的下标索引值 index查询方法 修改表功能的方法 插入方法 追加元素 单个元素追加 多…

C语言-两数组元素互换

#include <stdio.h> #include <string.h>//两数组元素互换 void swap(int ch1[],int ch2[],int sz) {int i 0;char ch 0;for(i 0;i < sz;i){ch ch1[i];ch1[i] ch2[i];ch2[i] ch;} } //打印数组元素 void print(int ch[],int sz) {int i 0;for(i 0;i <…

Git分布式管理-头歌实验日志和版本回退

在Git使用过程中&#xff0c;一种很常见的情况是&#xff1a;发现某个已经提交到仓库里的代码文件有致命的bug&#xff0c;必须将代码回滚到上一个版本&#xff0c;在这种情况下就显示出了Git的强大。Git为每次提交&#xff0c;都保留了日志&#xff0c;根据提交日志&#xff0…

前端开发中,并发请求工具的实现<多文件上传,数据切片>

前端开发中涉及到并发的业务中&#xff0c;如何优雅的实现一个并发工具 1.涉及并发的业务场景 1.> 多文件上传&#xff0c;支持过程中的进度展示&#xff0c;暂停&#xff0c;删除业务 2.> 多数据源的无参静态数据分片获取&#xff0c;如地图业务中海量静态点位的获取分…

centos7升级openssl_3

1、查看当前openssl版本 openssl version #一般都是1.几的版本2、下载openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解压 tar zxf openssl-3.0.3.tar.gz#进入指定的目录 cd openssl-3.0.33、编译安装遇到问题缺…

激活函数Swish(ICLR 2018)

paper&#xff1a;Searching for Activation Functions 背景 深度网络中激活函数的选择对训练和任务表现有显著的影响。目前&#xff0c;最成功和最广泛使用的激活函数是校正线性单元&#xff08;ReLU&#xff09;。虽然各种手工设计的ReLU替代方案被提出&#xff0c;但由于在…

机器学习入门-小白必看

机器学习 1. 机器学习的基本概念与背景2. 机器学习的常用方法3.是否需要学习机器学习&#xff0c;机器学习已经过时了&#xff1f;&#xff1f;4. 如何在机器学习上进行创新&#xff1f;5. 我该用哪种机器学习方法&#xff0c;如何定下来呢&#xff1f;总结&#xff08;对小白的…

gazebo平衡车模拟

gazebo和Ros中的平衡车模拟&#xff08;Noetic&#xff09; 控制原理 使用说明 在URDF模型中使用gazebo的 imu 插件获取平衡车姿态从 /joint_state 话题消息获取两轮的速度&#xff0c;相当于电机编码器速度环和直立环使用 串级PID 控制&#xff0c;框图如下&#xff1a;转向环…

02.变量

02.变量 01.变量 变量的概念&#xff1a; 1.变量的作用&#xff1a; 计算机中的存储空间&#xff0c;用于保存数据 2.定义变量的格式 变量名 值 注意&#xff1a; 是赋值运算符&#xff0c;左右两边打上空格是为了代码的规范性&#xff0c;美观性。 num1 3 #num1就是…

零基础学VR全景制作,新手制作流程有哪些?

VR全景技术可以应用于旅游、房地产、教育、娱乐等多个领域&#xff0c;可以为观众提供更加真实、更具沉浸感的体验。可以说&#xff0c;VR全景技术已经逐渐深入到各个领域中&#xff0c;那么对于新手来说&#xff0c;该如何制作VR全景呢&#xff1f; VR全景制作也是需要一定的技…

基于springboot的抗疫物资管理系统论文

目 录 摘 要 1 前 言 2 第1章 概述 2 1.1 研究背景 3 1.2 研究目的 3 1.3 研究内容 4 第二章 开发技术介绍 5 2.1相关技术 5 2.2 Java技术 6 2.3 MySQL数据库 6 2.4 Tomcat介绍 7 2.5 Spring Boot框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…

金三银四,程序员如何备战面试季

金三银四&#xff0c;程序员如何备战面试季 一个人简介二前言三面试技巧分享3.1 自我介绍 四技术问题回答4.1 团队协作经验展示 五职业规划建议5.1 短期目标5.2 中长期目标 六后记 一个人简介 &#x1f3d8;️&#x1f3d8;️个人主页&#xff1a;以山河作礼。 &#x1f396;️…

HarmonyOS—开启AOT编译模式

AOT&#xff08;Ahead Of Time&#xff09;即提前编译&#xff0c;能够在Host端&#xff08;即运行DevEco Studio的电脑&#xff09;将字节码提前编译成Target端&#xff08;即运行应用的设备&#xff09;可运行的机器码&#xff0c;这样字节码可以获得充分编译优化&#xff0c…

【AI视野·今日Sound 声学论文速览 第五十期】Fri, 1 Mar 2024

AI视野今日CS.Sound 声学论文速览 Fri, 1 Mar 2024 Totally 9 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Probing the Information Encoded in Neural-based Acoustic Models of Automatic Speech Recognition Systems Authors Quentin Raymondau…

SpringCloud--Sentinel使用

一、快速开始 Sentinel 的使用可以分为两个部分&#xff1a; 核心库&#xff08;Java 客户端&#xff09;&#xff1a;不依赖任何框架/库&#xff0c;能够运行于 Java 8 及以上的版本的运行时环境&#xff0c;同时对 Dubbo / Spring Cloud 等框架也有较好的支持。控制台&…

【Spring高级】第1讲:BeanFactory 与 ApplicationContext

目录 两者关系BeanFactory功能ApplicationContext功能 两者关系 BeanFactory和ApplicationContext都是Spring框架中非常重要的接口&#xff0c;它们都与Spring的IoC容器有关。 下面通过SpringApplication的引导类来说明上面两个接口。 看下面代码&#xff1a; SpringBootAp…

【场景题】如何设计一个购物车功能?

本文参考文章&#xff1a;https://www.hollischuang.com/archives/6998 https://www.woshipm.com/pd/4115447.html https://zq99299.github.io/note-book/back-end-storage/01/03.html 首先我们要明白&#xff1a;购物车系统在电商系统中的角色是作为用户选购商品和最终下单的桥…

Flutter中的三棵树

Widget Tree&#xff1a; 页面配置信息。 Element Tree&#xff1a; Widget tree的实例化对象&#xff0c;创建出renderObject&#xff0c;并关联到element.renderobject属性上&#xff0c;最后完成RenderObject Tree的创建。 RenderObject Tree&#xff1a;完成布局和图层绘制…

Unity2013.1.19_DOTS_Burst compiler

Unity2013.1.19_DOTS_Burst compiler DOTS是一种新产品&#xff0c;现在尚在起步阶段。由于它处于持续发展中&#xff0c;随着我们努力使其达到最佳状态&#xff0c;您将看到API会不断演变和日趋成熟。 DOTS包含以下元素&#xff1a; 实体组件系统(ECS) - 提供使用面向数据的…