深入了解队列:探索FIFO数据结构及队列

之前介绍了栈:探索栈数据结构:深入了解其实用与实现(c语言实现栈)

那就快马加鞭来进行队列内容的梳理。队列和栈有着截然不同的工作方式,队列遵循先进先出(FIFO)的原则,在许多场景下都表现出强大的效率和实用性

源码可以来我的github进行查找:Nerosts/just-a-try: 学习c语言的过程、真 (github.com)


文章目录

  • 1.队列的概念及结构
  • 2.队列的实现
    • 2.1项目文件规划
    • 2.2基本结构及各功能(Queue.h)
    • 2.3各功能具体实现(Queue.c)
      • 初始化
      • 插入
      • 删除
      • 返回最后一个节点数据
      • 返回第一个节点数据
      • 是否为空
      • 节点数量
      • 销毁


1.队列的概念及结构

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

入队列:进行插入操作。此端称为队尾

出队列:进行删除操作。此段称为队头

请添加图片描述

假设入队:A B C D

那么出队:A B C D


2.队列的实现

队列也可以数组和链表的结构实现,使用链表的结构来实现更适合一些,因为使用数组的结构,出队列这个操作在数组头上出数据(届时会需要全体移动),效率会比较低

2.1项目文件规划

请添加图片描述

  • 头文件Queue.h:用来基础准备(常量定义,typedef),链表表的基本框架,函数的声明
  • 源文件Queue.c:用来各种功能函数的具体实现
  • 源文件test.c:用来测试功能是否有问题,进行基本功能的使用

2.2基本结构及各功能(Queue.h)

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

typedef int QDataType;

typedef struct QueueNode//节点的结构体
{
	QDataType val;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size; //元素数量(空间换时间)
}Queue;

void QInit(Queue* q);//初始化
void QDestroy(Queue* q);//销毁

void QPush(Queue* q, QDataType x);//插入
void QPop(Queue* q);//删除

QDataType QBack(Queue* q);//返回最后一个节点数据
QDataType QFront(Queue* q);//返回第一个节点数据

bool QEmpty(Queue* q);//是否为空

int QSize(Queue* q);//元素数量

这两个结构体组合在一起,构成了队列数据结构的基本框架

  • QNode 结构体用于表示队列中的节点

  • Queue 结构体则用于管理整个队列的状态和属性

    这种设计使得队列的操作和功能得以清晰地表现和实现

2.3各功能具体实现(Queue.c)

初始化

void QInit(Queue* q)
{
	assert(q);
	q->phead = q->ptail = NULL;
	q->size = 0;
}
  • 将队列的头尾指针设置为 NULL,表示队列为空。
  • 将队列中元素的数量设置为 0,因为队列此时没有任何元素

插入

void QPush(Queue* q, QDataType x)
{
	assert(q);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	assert(newnode);//防止没有开辟成功(当人有点杞人忧天了)
	newnode->val = x;
	newnode->next = NULL;

	if (q->phead == NULL)
	{
		q->phead = q->ptail = newnode;
	}
	else
	{
		q->ptail->next = newnode;
		q->ptail = newnode;
	}
	q->size++;
}
  • 首先使用 assert 确保传入的队列指针 q 是有效的
  • 为新节点 newnode 分配内存,并设置其值为 xnext 指针指向 NULL
  • 如果队列为空(即头尾指针均为空),则将新节点同时设置为队列的头尾节点。
  • 如果队列不为空,则将新节点连接到队列尾部,并更新尾指针 ptail 指向新的尾节点。
  • 最后,增加队列的大小 size

删除

void QPop(Queue* q)
{
	assert(q);
	assert(q->size > 0);
	QNode* next = q->phead->next;
	free(q->phead);
	q->phead = next;
	//当只有一个节点时:把	q->ptail = NULL;
	if (q->phead == NULL)
	{
		q->ptail = NULL;
	}
	q->size--;
}
  • 首先使用 assert 确保传入的队列指针 q 是有效的,并且队列中有元素即(size > 0
  • 通过 next 指针将队列头部的下一个节点保存下来,以备后续更新
  • 释放队列当前的头节点
  • 更新队列的头指针为下一个节点(如果有的话)
  • 如果删除节点后队列为空==(只有一个节点),则将尾指针 ptail 也设置为 NULL(一个节点时,二者指向同一个地址)==
  • 最后,减少队列的大小 size

返回最后一个节点数据

QDataType QBack(Queue* q)
{
	assert(q);
	assert(q->ptail);
	return q->ptail->val;
}

返回第一个节点数据

QDataType QFront(Queue* q)
{
	assert(q);
	assert(q->ptail);
	return q->phead->val;
}

是否为空

bool QEmpty(Queue* q)
{
	assert(q);
	return q->size == 0;
}

节点数量

int QSize(Queue* q)
{
	assert(q);
	return q->size;
}

销毁

void QDestroy(Queue* q)
{
	QNode* cur = q->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	q->phead = q->ptail = NULL;
	q->size = 0;
}

队列的内容也整理完毕了,下一次会为大家带来二叉树和堆的相关内容,感谢大家的支持!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

共享目录防火墙

导语&#xff1a; 为什么需要配置文件夹共享功能&#xff1f; 我们在工作和生活中经常有需要将自己的文件复制给他人或者将他人的文件复制过来的需求。 有时候我们使用u盘&#xff0c;有时候我们使用qq或者飞秋等软件&#xff0c;但是u盘和软件并不是万能的&#xff0c;比如没…

(10)Linux冯诺依曼结构操作系统的再次理解

&#x1f4ad; 前言&#xff1a;本章我们首先会明确冯诺依曼体系结构的概念&#xff0c;旨在帮助大家理解体系结构在硬件角度去理解数据流走向的问题。理解完之后我们再去谈操作系统、更多有关操作系统的细节&#xff0c;着重谈谈操作系统概念与定位、操作系统是如何去做管理的…

聚观早报 |吉利银河E8将上市;三星Galaxy S24将登场

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 12月26日消息 吉利银河E8将上市 三星Galaxy S24将登场 哪吒L内饰曝光 苹果首款MR头显正量产 IEEE全球研究报告 …

使用防火墙是否可以应对DDoS攻击?

很多游戏行业公司对网络安全不够了解&#xff0c;觉得装个防火墙就可以万事大吉了。实际上使用防火墙确实是解决DDoS攻击问题的一种有效方法&#xff0c;一些更先进的防火墙还可以采用其他防御措施&#xff0c;例如:深度包检测、行为分析、人工智能等&#xff0c;来识别和防御各…

Zookeeper-一致性协议ZAB

ZAB协议介绍 ZAB 协议全称&#xff1a;Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子广播协议&#xff09;。 Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面&#xff0c;Zookeeper 并没有使用 Paxos &#xff0c;而是采用了…

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(3)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识&#xff08;2&#xff09; 1.1 PCI总线的组成 如前文所述&#xff0c;PCI总线作为处理器系统的本地总线&#xff0c;是处理器系统的一个组成部件。因此&#xff0c;讲述PCI总线的…

​ iOS技术博客:App备案指南

&#x1f4dd; 摘要 本文介绍了移动应用程序&#xff08;App&#xff09;备案的重要性和流程。备案是规范App开发和运营的必要手段&#xff0c;有助于保护用户权益、维护网络安全和社会秩序。为了帮助开发者更好地了解备案流程&#xff0c;本文提供了一份最新、最全、最详的备…

分布式训练通信NCCL之Ring-Allreduce详解

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

PostgreSQL 可观测性最佳实践

简介 软件简述 PostgreSQL 是一种开源的关系型数据库管理系统 (RDBMS)&#xff0c;它提供了许多可观测性选项&#xff0c;以确保数据库的稳定性和可靠性。 可观测性 可观测性&#xff08;Observability&#xff09;是指对数据库状态和操作进行监控和记录&#xff0c;以便在…

【Linux系统基础】(3)在Linux上部署运维监控Zabbix和Grafana

目录 运维监控Zabbix部署简介安装安装前准备 - Mysql安装Zabbix Server 和 Zabbix Agenta. 安装Zabbix yum库b. 安装Zabbix Server、前端、Agentc. 初始化Mysql数据库d. 为Zabbix Server配置数据库e. 配置Zabbix的PHP前端 配置zabbix 前端&#xff08;WEB UI&#xff09; 运维监…

HTML代码全解析

HTML代码全解析实例解析 <!DOCTYPE html> 声明为 HTML5 文档<html> 元素是 HTML 页面的根元素<head> 元素包含了文档的元&#xff08;meta&#xff09;数据&#xff0c;如 <meta charset"utf-8"> 定义网页编码格式为 utf-8。<title> 元…

计算机毕业设计 基于SpringBoot的高校宣讲会管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

hash路由和history路由的区别

当我们构建前端应用时&#xff0c;路由是一个重要的概念。它允许我们在不刷新整个页面的情况下&#xff0c;根据URL的变化来加载不同的内容。在前端开发中&#xff0c;有两种常见的路由实现方式&#xff1a;哈希路由&#xff08;Hash Routing&#xff09;和历史路由&#xff08…

技术合集|企业AI应用落地的关键问题和应对方法

目录 一、生成式AI助力数字化转型的关键 二、用大模型来做什么 三、AI应用如何落地 四、写在最后 2022年11月&#xff0c;OpenAI正式推出ChatGPT&#xff0c;短短一年的时间里&#xff0c;人类被迫重温了文字语言在人类文明中的重要作用——承载着一切的思维表达与沟通实现…

java毕业设计—vue+springboot影院售票及电影管理系统

1&#xff0c;项目背景 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的电影院购票选座系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于vue和SpringBoot框架下开发&#xff1b;管理员通过后台管理系统实现管理影院信息&#xff0c;电影信息&…

Node.js-模块与包

1. 模块 1.1 模块化的基本概念 1.2 模块化规范 2.Node.js中的模块化 2.1 Node.js中的模块化分类 2.2 加载模块 2.3 Node.js中的模块作用域 2.4 向外共享模块作用域的成员 2.4.1 module对象 2.4.2 module.exports对象 2.4.3 共享成员的注意点 2.4.4 exports对象 2.5 Node.js中…

介绍一下我本地使用的截图工具 PixPin

介绍一下我本地使用的截图工具 PixPin 0. 背景1. PixPin 安装文件下载2. PixPin 安装3. PixPin 简单配置4. PixPin 使用 0. 背景 截图是工作上的经常性需求&#xff0c;一个好的截图工具会大大提高我们的工作效率。 一直以来&#xff0c;非常喜欢微信自带的截图功能&#xff…

抖店新手应该怎么玩?如何运营?

我是电商珠珠 抖店作为一个短视频电商平台&#xff0c;其兴趣电商发展模式深受大众的喜爱&#xff0c;虽然和拼多多一样&#xff0c;都是走的低价平台&#xff0c;但是在规则和玩法上&#xff0c;略胜一筹。 所以&#xff0c;很多想要做店的人都想要去入驻这个平台&#xff0…

【网络奇缘】——奈氏准则和香农定理从理论到实践一站式服务|计算机网络

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 失真 - 信号的变化 影响信号失真的因素&#xff1a; ​编辑 失真的一种现象&#xff1a;码间…

TPU-MLIR

1、AI 编译器 TPU&#xff0c;张量处理器 AI编译器&#xff0c;把不同框架下的搭建起来的模型&#xff0c;转换为统一形式的中间表达 IR&#xff0c;然后通过 IR 转换成可以在特定芯片平台上运行的二进制模型 Top&#xff0c;芯片无关层&#xff1a;图优化、量化、推理 Tpu…