队的简单介绍

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

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

出队列:进行删除操作的一端称为队头。

入队列如下图所示:

出队列如下图所示:

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,需要挪动后面的队员,效率会比较低。使用单链表的话只需要执行头删的操作即可。

队列的头文件:Queue.h文件:

队员和队头尾指针的关系:

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>// 创建队的节点(队员)
typedef int QDataType;   // 需要存放其他数据将int改为对应数据类型即可
typedef struct QueueNode
{struct QueueNode* _next;QDataType _data;
}QueueNode;// 创建队(队头指针,队尾指针)
typedef struct Queue
{QueueNode* _phead;QueueNode* _ptail;
}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);// 队员个数
int QueueSize(Queue* pq);// 检测队列是否为空,如果为空返1,如果非空返回0 
int QueueEmpty(Queue* pq);

队列的实现:Queue.c文件:

队列的初始化和销毁:

初始化只需要将头尾指针置空即可;销毁创建一个指针=头指针和一个指针保存头指针指向的下一个队员的地址。逐一释放之后头尾指针都要置空避免成为野指针造成非法访问。

#define _CRT_SECURE_NO_WARNINGS 
#include "Queue.h"// 队的初始化
void QueueInit(Queue* pq)
{assert(pq);pq->_phead = pq->_ptail = NULL;
}// 队的销毁
void QueueDestroy(Queue* pq)
{Queue* pcur = pq->_phead;while (pcur){Queue* next = pcur->_phead->_next;free(pcur);pcur = next;}pq->_phead = pq->_ptail = NULL;
}

入队列和出队列:

入队列相当于是单链表的尾插,这里使用的是malloc()函数,参数为申请开辟的字节个数,返回开辟后的空间地址。同样判断是否开辟成功,若失败则打印原因,成功则_data赋值x,_next指针置空。入队如果对空则队头队尾指针都指向newnode,否则队尾的_next指针指向newnode,队尾指针向后移动到newnode的位置。

出队相当于头删,需要断言队不为空队。创建一个队员指针指向队头的下一个队员,然后删掉队头,让队头指针指向下一个成员,即刚刚保存的指针。如果队员全部出队之后队头指针为空,再将队尾指针置空避免成为野指针。

// 队尾入队列 
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->_data = x;newnode->_next = NULL;// 入队if (pq->_phead == NULL){pq->_phead = pq->_ptail = newnode;}else{pq->_ptail->_next = newnode;pq->_ptail = newnode;}
}// 队头出队列 
void QueuePop(Queue* pq)
{assert(pq);assert(pq->_phead);QueueNode* nodenext = pq->_phead->_next;free(pq->_phead);pq->_phead = nodenext;// 删完了队头尾指针都要置空if (pq->_phead == NULL){pq->_phead = pq->_ptail = NULL;}
}

取队头和队尾的元素都是直接返回队头队尾指针指向的_data数据即可。

队员的个数,需要遍历整个队伍,采用计数器的方法,记录再将其返回即可。

判断队伍是否空队伍和栈一样使用三目操作符完成。

// 获取队列头部元素 
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->_phead);return pq->_phead->_data;
}// 获取队列队尾元素 
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->_phead);return pq->_ptail->_data;
}// 队员个数
int QueueSize(Queue* pq)
{assert(pq);assert(pq->_phead);int size = 0;QueueNode* pcur = pq->_phead;while (pcur){size++;pcur = pcur->_next;}return size;
}// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* pq)
{assert(pq);return pq->_phead == NULL ? 1 : 0;
}

队的实现测试test.c文件:

#define _CRT_SECURE_NO_WARNINGS 
#include "Queue.h"void test()
{Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);QueuePush(&q, 4);printf("%d\n", QueueSize(&q));while (!QueueEmpty(&q))             // 利用队伍不为空队作为循环条件{printf("%d ", QueueFront(&q));  // 取队头元素QueuePop(&q);                   // 取队头元素之后要执行出队操作}printf("\n");QueueDestroy(&q);
}int main()
{test();return 0;
}

结论:本文介绍了队列数据结构的基本概念和链式实现方法。队列是一种先进先出(FIFO)的线性表,支持在队尾插入(入队)和队头删除(出队)操作。文章详细阐述了用单链表实现队列的优势,相比数组实现避免了数据搬移的开销。代码实现包含队列初始化、销毁、入队、出队等核心操作,以及获取队头队尾元素、队列大小和判空等辅助功能。测试用例展示了队列的基本使用方法。整个实现通过头指针和尾指针管理队列,出队时执行头删操作,入队时执行尾插操作,确保了操作的高效性。

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

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

相关文章

AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法(一)

环境&#xff1a; AI-Sphere-Butler VBCABLE2.1.58 Win10专业版 豆包桌面版1.47.4 ubuntu22.04 英伟达4070ti 12G python3.10 问题描述&#xff1a; AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法&#xff08;一&#xff09; 聊天视频&#xff1a; AI真…

【STM32】启动流程

1、.s启动文件解析 STM32的启动文件&#xff08;一般是.s汇编文件&#xff0c;如startup_stm32f407xx.s&#xff09;是STM32上电后执行的第一段代码&#xff0c;承担着“系统初始化化引导员”的角色。 它的主要作用是设置初始化栈指针&#xff08;SP&#xff09;、程序计数器&…

【vim】通过vim编辑器打开、修改、退出配置文件

通过vim编辑器打开任一配置文件 vim /etc/profile 英文输入下&#xff0c;按i键进入INSERT模式&#xff0c;修改配置文件 完成修改后&#xff0c;按esc键退出INSERT模式 英文输入下&#xff0c;输入":wq!"&#xff0c;即可保存并退出 :q #不保存并退出 :q! …

Effective Modern C++ 条款6:当 auto 推导类型不符合预期时,使用显式类型初始化惯用法

在C开发中&#xff0c;auto关键字以其简洁性和高效性被广泛使用。然而&#xff0c;“自动推导”并非万能&#xff0c;尤其在某些特殊场景下&#xff0c;auto的推导结果可能与开发者预期不符&#xff0c;甚至导致未定义行为。今天&#xff0c;我们以《Effective Modern C》条款6…

学习Linux进程冻结技术

原文&#xff1a;蜗窝科技Linux进程冻结技术 功耗中经常需要用到&#xff0c;但是linux这块了解甚少&#xff0c;看到这个文章还蛮适合我阅读的 1 什么是进程冻结 进程冻结技术&#xff08;freezing of tasks&#xff09;是指在系统hibernate或者suspend的时候&#xff0c;将…

GitHub 趋势日报 (2025年06月22日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 624 LLMs-from-scratch 523 ai-engineering-hub 501 n8n 320 data-engineer-handb…

kotlin中为什么新增扩展函数功能?

在 Kotlin 中&#xff0c;扩展函数的本质是「不修改原有类代码&#xff0c;为其新增功能」&#xff0c;这源自编程中「开闭原则」&#xff08;对扩展开放&#xff0c;对修改关闭&#xff09;的第一性原理。 核心需求&#xff1a;当需要给第三方库的类&#xff08;如 Android 的…

excel 数据透视表介绍

Excel 数据透视表(PivotTable)就是你的数据分析神器!它能帮你快速汇总、分类、比较和分析 大量数据&#xff0c;从看似杂乱无章的表格中一键提取关键信息 &#xff0c;生成交互式的汇总报告。无需复杂公式&#xff0c;只需拖拽几下&#xff0c;就能让数据“开口说话”&#xff…

半导体行业中的专用标准产品ASSP是什么?

半导体行业中的专用标准产品ASSP是什么&#xff1f; “专用标准产品”&#xff08;ASSP - Application Specific Standard Product&#xff09;是半导体集成电路中的一个重要分类。 你可以把它理解为介于通用标准产品和全定制ASIC之间的一种芯片。以下是它的核心定义和特点&a…

秋招Day14 - MySQL - 锁

MySQL中有几种类型的锁&#xff1f; 锁粒度来分&#xff0c;有表锁、页锁和行锁。 加锁机制划分&#xff0c;有乐观锁和悲观锁。 按兼容性划分&#xff0c;有共享锁和排他锁。 按锁模式划分&#xff0c;有记录锁&#xff0c;间隙锁&#xff0c;next-key锁&#xff0c;意向锁…

/var/lib/docker/overlay2目录过大怎么办

/var/lib/docker/overlay2 是 Docker 默认用于存储 容器镜像和容器运行时数据 的核心目录&#xff0c;基于 overlay2 存储驱动实现。以下是其具体作用和内容的详细解析&#xff1a; 1. overlay2 目录的作用 存储镜像分层结构&#xff1a; Docker 镜像采用分层设计&#xff0c;o…

JimuReport:一款免费的数据可视化报表工具

JimuReport&#xff08;积木报表&#xff09;是一款免费的企业级数据可视化报表软件&#xff0c;提供拖拽的方式像搭建积木一样完成在线设计&#xff0c;功能涵盖数据报表、打印设计、图表报表、门户设计、大屏设计等。 数据源 JimuReport 支持 30 多种数据源&#xff0c;包括…

Neo4j.5.X社区版创建数据库和切换数据库

在使用Neo4j数据库&#xff08;版本&#xff1a;neo4j-community-5.22.0&#xff09;时&#xff0c;系统自带的“neo4j”和“system”数据库适用于日常的简单学习和练习&#xff0c;但对于新的项目&#xff0c;将项目数据与练习数据混用会带来诸多不便&#xff0c;例如查询效率…

DAY33神经网络

浙大疏锦行 定义了一个简单的神经网络&#xff0c;主要是掌握pytorch框架

拼团系统多层限流架构详解

拼团系统多层限流架构详解 一、整体架构设计理念 多层限流采用"层层设防"思想&#xff0c;通过网关层全局流量控制→服务层接口粒度限流→本地资源隔离→热点参数精准防护的四级防御体系&#xff0c;实现从粗到细的流量治理&#xff0c;确保大促期间系统稳定性。 …

[ctfshow web入门] web92 `==`特性与intval特性

信息收集 和之前的题差不多&#xff0c;这次是使用了不严格相等的&#xff0c;详情看这篇博客&#xff1a; 和 在 PHP 中有何区别&#xff1f;一共包含哪些部分&#xff1f; 首先&#xff0c;不能使$num 4476&#xff0c;然后需要使intval($num,0)4476 include("flag…

在Springboot项目部署时遇到,centos服务器上,curl请求目标地址不通 ,curl -x 可以请求通的解决办法

在甲方服务器部署项目时&#xff0c;通常遇到需要开通外网权限的问题&#xff0c;有的是直接给开通服务器的白名单&#xff0c;就可以直接访问白名单外网地址了。也有的是通过网络转发&#xff0c;将url前面的部分替换&#xff0c;可以进行网络请求。有一次遇到一个罕见的&…

Python异步爬虫编程技巧:从入门到高级实战指南

Python异步爬虫编程技巧&#xff1a;从入门到高级实战指南 &#x1f680; &#x1f4da; 目录 前言&#xff1a;为什么要学异步爬虫异步编程基础概念异步爬虫核心技术栈入门实战&#xff1a;第一个异步爬虫进阶技巧&#xff1a;并发控制与资源管理高级实战&#xff1a;分布式…

JMeter-SSE响应数据自动化3.0

背景 此次因为多了一些需要过滤排除的错误(数量很少)&#xff0c;还需要修改下JMeter的jtl文件输出数据&#xff08;后续统计数据需要&#xff09; 所以只涉及到JSR脚本的一些改动(此部分改动并不会影响到JMeter的HTML报告) 改动 主要通过设置JMeter中prev输出数据变量threadN…

012 进程状态和优先级

&#x1f984; 个人主页: 小米里的大麦-CSDN博客 &#x1f38f; 所属专栏: Linux_小米里的大麦的博客-CSDN博客 &#x1f381; GitHub主页: 小米里的大麦的 GitHub ⚙️ 操作环境: Visual Studio 2022 文章目录 进程状态和优先级一、进程状态分类特殊状态说明 二、如何查看进程…