队列的讲解与实现

这里写目录标题

  • 一、队列的概念及结构
  • 二、队列的实现(使用VS2022的C语言)
    • 1.初始化、销毁
    • 2.入队、出队
    • 3.返回队头元素、返回队尾元素、判空、返回有效元素个数
  • 三、完整 Queue.c 源代码

一、队列的概念及结构

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

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

第一次入队:
在这里插入图片描述
正常入队:
在这里插入图片描述
正常出队:
在这里插入图片描述
只剩最后一个元素时出队:
在这里插入图片描述

二、队列的实现(使用VS2022的C语言)

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

队列常用的接口包括:

1.初始化、销毁

2.入队、出队

3.返回队头元素、返回队尾元素、判空、返回有效元素个数

在 Queue.h 中:

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>typedef int QDataType;typedef struct QListNode
{QDataType data;				// 数据struct QListNode* next;		// 保存下一元素地址的指针变量
} QListNode, * pQListNode;typedef struct Queue
{pQListNode front;			// 队头指针变量pQListNode rear;			// 队尾指针变量int size;					// 有效元素个数
} Queue, * pQueue;// 初始化、销毁
void QueueInit(pQueue pque);void QueueDestroy(pQueue pque);// 入队、出队
void QueuePush(pQueue pque, QDataType x);void QueuePop(pQueue pque);// 返回队头元素、返回队尾元素
QDataType QueueFront(pQueue pque);QDataType QueueBack(pQueue pque);// 判空、返回有效元素个数
bool QueueEmpty(pQueue pque);int QueueSize(pQueue pque);

1.初始化、销毁

// 初始化、销毁
void QueueInit(pQueue pque)
{assert(pque);pque->size = 0;pque->front = pque->rear = NULL;
}void QueueDestroy(pQueue pque)
{assert(pque);// 从队头开始删数据while (pque->front){pQListNode temp = pque->front->next;free(pque->front);pque->front = temp;}pque->rear = NULL;pque->size = 0;
}

2.入队、出队

// 入队、出队
void QueuePush(pQueue pque, QDataType x)
{assert(pque);pQListNode newNode = (pQListNode)malloc(sizeof(QListNode));newNode->data = x;newNode->next = NULL;if (pque->front == NULL)		// 队列为空时,修改队头队尾{pque->front = newNode;pque->rear = newNode;}else							// 只修改队尾{pque->rear->next = newNode;pque->rear = newNode;}++pque->size;
}void QueuePop(pQueue pque)
{assert(pque);assert(pque->front && pque->rear);pQListNode temp = pque->front->next;free(pque->front);pque->front = temp;if (pque->front == NULL)		// 若队头删除数据后为空{pque->rear = NULL;}
}

3.返回队头元素、返回队尾元素、判空、返回有效元素个数

// 返回队头元素、返回队尾元素
QDataType QueueFront(pQueue pque)
{assert(pque && pque->front);return pque->front->data;
}QDataType QueueBack(pQueue pque)
{assert(pque && pque->rear);return pque->rear->data;
}// 判空、返回有效元素个数
bool QueueEmpty(pQueue pque)
{assert(pque);return pque->front == NULL;
}int QueueSize(pQueue pque)
{assert(pque);return pque->size;
}

三、完整 Queue.c 源代码

#include "Queue.h"// 初始化、销毁
void QueueInit(pQueue pque)
{assert(pque);pque->size = 0;pque->front = pque->rear = NULL;
}void QueueDestroy(pQueue pque)
{assert(pque);// 从队头开始删数据while (pque->front){pQListNode temp = pque->front->next;free(pque->front);pque->front = temp;}pque->rear = NULL;pque->size = 0;
}// 入队、出队
void QueuePush(pQueue pque, QDataType x)
{assert(pque);pQListNode newNode = (pQListNode)malloc(sizeof(QListNode));newNode->data = x;newNode->next = NULL;if (pque->front == NULL)		// 队列为空时,修改队头队尾{pque->front = newNode;pque->rear = newNode;}else							// 只修改队尾{pque->rear->next = newNode;pque->rear = newNode;}++pque->size;
}void QueuePop(pQueue pque)
{assert(pque);assert(pque->front && pque->rear);pQListNode temp = pque->front->next;free(pque->front);pque->front = temp;if (pque->front == NULL)		// 若队头删除数据后为空{pque->rear = NULL;}
}// 返回队头元素、返回队尾元素
QDataType QueueFront(pQueue pque)
{assert(pque && pque->front);return pque->front->data;
}QDataType QueueBack(pQueue pque)
{assert(pque && pque->rear);return pque->rear->data;
}// 判空、返回有效元素个数
bool QueueEmpty(pQueue pque)
{assert(pque);return pque->front == NULL;
}int QueueSize(pQueue pque)
{assert(pque);return pque->size;
}

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

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

相关文章

【Linux】进程(8):Linux真正是如何调度的

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;8&#xff09;&#xff1a;Linux真正是如何调度的&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 之前我们讲过&#xff0c;在大…

代码随想录算法训练营第四十九天 | 139.单词拆分、多重背包、背包问题总结

139.单词拆分 视频讲解&#xff1a; 动态规划之完全背包&#xff0c;你的背包如何装满&#xff1f;| LeetCode&#xff1a;139.单词拆分_哔哩哔哩_bilibili 代码随想录 解题思路 1.dp[i] 字符串的长度为i&#xff0c;dp[i]是否可以被组成 2.递推公式 if( [j,i] && d…

硬件IIC和软件IIC的比较

&#xff08;一&#xff09;硬件IIC 硬件IIC是由STM32内部的硬件模块实现的&#xff0c;使用CPU的时钟信号来控制数据传输和时序&#xff0c;通信速度较快&#xff0c;可以达到几十MHz的速度。硬件IIC的实现相对简单&#xff0c;无需编写复杂的代码&#xff0c;因此在实现IIC通…

如何理解与学习数学分析——第二部分——数学分析中的基本概念——第5章——序列

第2 部分&#xff1a;数学分析中的基本概念 (Concepts in Analysis) 5. 序列(Sequences) 本章介绍了序列属性&#xff0c;例如单调性、有界性和收敛性&#xff0c;使用图表和示例来解释这些属性&#xff0c;并演示如何在各种证明中使用它们的定义。讨论了趋于无穷大的序列出…

centos官方yum源不可用 解决方案(随手记)

昨天用yum安装软件的时候&#xff0c;就报错了 [rootop01 ~]# yum install -y net-tools CentOS Stream 8 - AppStream 73 B/s | 38 B 00:00 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlis…

创新指南 | 5个行之有效的初创企业增长策略

本文探讨了五种初创企业实现快速增长的有效策略&#xff1a;利用网络效应通过激励和资本化用户增长&#xff1b;通过持续提供高质量内容建立信任和权威的内容营销&#xff1b;利用简单有效的推荐计划扩展用户群&#xff1b;采用敏捷开发方法快速适应市场变化和客户反馈&#xf…

[消息队列 Kafka] Kafka 架构组件及其特性(二)Producer原理

这边整理下Kafka三大主要组件Producer原理。 目录 一、Producer发送消息源码流程 二、ACK应答机制和ISR机制 1&#xff09;ACK应答机制 2&#xff09;ISR机制 三、消息的幂等性 四、Kafka生产者事务 一、Producer发送消息源码流程 Producer发送消息流程如上图。主要是用…

国自然基金的检索

&#xff08;1&#xff09;网址 跳转国自然基金网址&#xff1a;https://www.nsfc.gov.cn/ &#xff08;2&#xff09;查询入口 &#xff08;3&#xff09;进行查询

【LeetCode 滑动窗口】LC_3_无重复字符的最长子串

文章目录 1. 无重复字符的最长子串 1. 无重复字符的最长子串 题目链接&#x1f517; &#x1f34e;题目思路&#xff1a;&#x1f427;① 滑动窗口的思想&#xff1b;&#x1f427;② 用什么来维护窗口呢 &#xff1f; 用 双指针 和 unordered_set来维护&#xff0c;为什么呢…

Git介绍及应用

1.简介 Git是一个分布式版本控制器&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件&#xff0c;Git仓库分为两种&#xff1a; 本地仓库:开发人员自己电脑上的Git仓库远程仓库:远程服务器上的Git仓库 2.执行流程 3.Git代码托管服务…

【TB作品】MSP430F5529 单片机,温度控制系统,DS18B20,使用MSP430实现的智能温度控制系统

作品功能 这个智能温度控制系统基于MSP430单片机设计&#xff0c;能够实时监测环境温度并根据预设的温度报警值自动调节风扇和加热片的工作状态。主要功能包括&#xff1a; 实时显示当前温度。通过OLED屏幕显示温度报警值。通过按键设置温度报警值。实际温度超过报警值时&…

【96】write combine机制介绍

前言 这篇文章主要介绍了write combine的机制 一、write combine的试验 1.系统配置 &#xff08;1&#xff09;、CPU&#xff1a;11th Gen Intel(R) Core(TM) i7-11700 2.50GHz &#xff08;2&#xff09;、GPU&#xff1a;XX &#xff08;3&#xff09;、link status&am…

MySQL(四) - SQL优化

一、SQL执行流程 MySQL是客户端-服务器的模式。一条SQL的执行流程如下&#xff1a; 在执行过程中&#xff0c;主要有三类角色&#xff1a;客户端、服务器、存储引擎。 大致可以分为三层&#xff1a; 第一层&#xff1a;客户端连接到服务器&#xff0c;构造SQL并发送给服务器…

惠海 H5528 升降压芯片 12V24V36V48V60V75V LED恒流驱动IC 调光细腻顺滑无阶梯感

惠海H5528是一款升压、降压、升压降压的LED恒流驱动IC&#xff0c;其具备宽范围调光比且无频闪调光的特性&#xff0c;使得它在智能照明、Dali调光、0~10V调光、摄影灯照明以及补光灯照明等多种应用中具有广泛的应用前景。 这款芯片支持降压、升压和升降压拓扑的应用&#xff0…

C++面向对象程序设计 - 文件操作与文件流

在实际应用中&#xff0c;常以磁盘文件作为对象&#xff0c;即能从磁盘文件读取数据&#xff0c;也能将数据输出到磁盘文件&#xff0c;磁盘是计算机的外部存储器&#xff0c;能够长期保留信息&#xff0c;能读能写&#xff0c;可以刷新重写等等。 在C中&#xff0c;文件操作通…

106.网络游戏逆向分析与漏洞攻防-装备系统数据分析-在UI中显示装备与技能信息

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

新媒体暴力起号必备因素!沈阳新媒体运营培训学校

1周涨粉10w&#xff1f;这对普通人来说可以说是天文数字&#xff0c;但只要掌握方式方法&#xff0c;普通人也能做到&#xff01; 面试经验丰富的人都深知&#xff0c;给面试官留下的第一印象相当重要&#xff0c;几乎决定了80%的面试机会。标题也是如此&#xff0c;在完成一篇…

[经验] 蝉联一词的含义是什么 #知识分享#职场发展

蝉联一词的含义是什么 蝉联这个词起源于古代中国&#xff0c;最初是指天子连续两年以上的年号相同。后来&#xff0c;这个词被用于形容某个人或某个团体连续多次获得某种荣誉或奖项的情况。在现代生活中&#xff0c;我们常常听到某个体育运动员蝉联冠军、某个企业蝉联业绩排行榜…

基于拓扑漏洞分析的网络安全态势感知模型

漏洞态势分析是指通过获取网络系统中的漏洞信息、拓扑信息、攻击信息等&#xff0c;分析网络资产可能遭受的安全威胁以及预测攻击者利用漏洞可能发动的攻击&#xff0c;构建拓扑漏洞图&#xff0c;展示网络中可能存在的薄弱环节&#xff0c;以此来评估网络安全状态。 在网络安…

科普|大数据风险检测对申贷人有哪些好处?

大数据风险检测可以极大地提高金融机构在用户肖像、反欺诈和信用评级等方面的效率和风险控制能力&#xff0c;这是金融企业发展过程中必须结合的一种科技技术。大数据风险检测覆盖信贷领域的所有流程&#xff0c;从客户获取到身份验证&#xff0c;再到信贷中和信贷后。因此&…