队列的讲解与实现

这里写目录标题

  • 一、队列的概念及结构
  • 二、队列的实现(使用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;在大…

conda虚拟环境如何卸载pip

要在conda虚拟环境中卸载pip&#xff0c;你可以使用conda命令来移除它。以下是具体步骤&#xff1a; 激活你想要移除pip的conda虚拟环境。 使用conda命令移除pip。 下面是具体的命令&#xff1a; bash conda activate your_env_name # 替换your_env_name为你的环境名称 cond…

代码随想录算法训练营第四十九天 | 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;并演示如何在各种证明中使用它们的定义。讨论了趋于无穷大的序列出…

API key学习笔记

API Key 基本上可以认为是一个长字符串&#xff0c;允许 API 消费者&#xff08;即使用 API 的人&#xff09;访问受限的功能和数据。它作为一种安全措施&#xff0c;确保了 API 服务能够控制谁有权限访问什么数据&#xff0c;同时也帮助跟踪API的使用情况。生成API key来调用A…

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…

Codeforces Round 950 (Div. 3) A B C D E

A. Problem Generator time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: standard output Vlad is planning to hold m m m rounds next month. Each round should contain one problem of difficulty levels ‘A’, ‘B’…

Java:JDK8 GC中ParNew和CMS的问题说明

JDK8中常用如下的垃圾收集器&#xff0c;它们分别运用在年轻代和老年代&#xff1a; ParNew : 年轻代垃圾收集器&#xff0c;多线程&#xff0c;采用标记—复制算法。 CMS&#xff1a;老年代的收集器&#xff0c;全称&#xff08;Concurrent Mark and Sweep&#xff09;&#…

[消息队列 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;为什么呢…

标题:深入探索Linux中的`ausyscall`

标题&#xff1a;深入探索Linux中的ausyscall&#xff08;注意&#xff1a;ausyscall并非Linux内核标准命令&#xff0c;但我们可以探讨类似的概念&#xff09; 在Linux系统中&#xff0c;系统调用&#xff08;syscall&#xff09;是用户空间程序与内核空间进行交互的一种重要…

Git介绍及应用

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

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

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

【经验分享】嵌入式入坑经历(选段)

文章目录 你现在的工作中所用到的专业知识有哪些呢&#xff1f;为什么想转行了&#xff1f;后来为什么从事了嵌入式行业呢?你对嵌入式的兴趣是何时培养起来的?你是怎么平衡兴趣爱好和工作的关系的?平时做的事情对你现在的工作有哪些帮助?对于有志学习嵌入式开发的在校大学生…

【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并发送给服务器…

Python | 排队取奶茶

队列的基本概念&#xff08;队头、队尾&#xff09;和特点&#xff08;先入先出&#xff09; 在 Python 语言中&#xff0c;标准库中的queue模块提供了多种队列的实现&#xff0c;比如普通队列和优先级队列&#xff0c;因此你可以使用queue.Queue类来创建队列&#xff0c;不过…