当前位置: 首页 > news >正文

队列(详解)

一.队列的概念

        队列(Queue)是一种常见的数据结构,它按照先进先出的原则管理数据。这意味着最先进入队列的元素将被最先移出队列,类似于现实生活中排队的场景。
在队列中,数据项被添加到队列的一端,称为队尾,而从队列中移除数据项的操作则发生在另一端,称为队首。新元素被添加到队列的尾部,并且从队列中移除元素时,总是从队列的头部开始。
队列的基本操作:

  1. 队列的初始化。
  2. 入队:将元素添加到队列的尾部。
  3. 出队:从队列的头部移除元素。
  4. 获取队首元素:查看队列的头部元素,但不移除它。
  5. 判断队列是否为空:检查队列是否不包含任何元素。
  6. 队列的销毁。

队列常用于需要按顺序处理数据的场景,比如任务调度、缓冲等。

二.队列的特点

        1.先进先出:队列中的元素按照先进先出的原则进行排列和访问。最先进入队列的元素将被最先移出队列。
        2.有限容量:队列通常具有固定的容量限制,即队列中能够容纳的元素数量是有限的。当队列已满时,无法再向其中添加新的元素,除非先移除队列中的一些元素。
        3.受限的访问:队列的访问受到限制,只能在队列的两端进行操作。元素的插入(入队)只能发生在队列的尾部,而元素的移除(出队)只能从队列的头部进行。
        4.动态变化:队列的大小可以动态地扩展或收缩,具体取决于实现队列的数据结构。一些队列的实现允许在需要时动态地增加其容量,以适应更多的元素。
        5.线性结构:队列是一种线性数据结构,元素之间的关系是一对一的。每个元素都有且仅有一个直接前驱和一个直接后继。
        6.适用性:队列常用于需要严格控制元素访问顺序的情况,如任务调度、资源分配等。
        7.高效性:对于队列中的元素添加和移除操作,时间复杂度通常是常数级别的。这使得队列在许多应用中具有高效的性能。
        8.应用广泛:队列是一种常见且重要的数据结构,在计算机科学和软件工程中被广泛应用,例如操作系统中的进程调度、网络数据包传输、消息队列、算法设计等领域。
        9.稳定性:队列的稳定性指的是对于相同的输入,输出结果是确定的,不受其他因素影响,而这一点栈结构是做不到的。这使得队列在许多算法和系统设计中具有可靠性和可预测性。

三.队列的实现

队列是基于链表和顺序表来实现,结合队列的特点使用链表来实现更为便洁。

源码:

Queue.h

#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
#define QueueData inttypedef struct QueueNode
{QueueData val;struct QueueNode* next;
}QueueNode;
typedef struct
{QueueNode* phead;QueueNode* pend;int size;
}Queue;//储存的是链表的头节点和链表的尾节点以及队列的元素个数,更容易维护队列。
void QueueInit(Queue* pQ);//初始化
void QueuePush(Queue* pQ, QueueData x);//队尾入队
void QueuePop(Queue* pQ);//出队
QueueData QueueFront(Queue* pQ);//取队头元素
int QueueSize(Queue* pQ);//获取队列元素个数
bool QueueEmpty(Queue* pQ);//判空
void QueueDestroy(Queue* pQ);//销毁队列

Queue.c

#include"Queue.h"
void QueueInit(Queue* pQ)
{assert(pQ);pQ->pend = pQ->phead = NULL;pQ->size = 0;
}
void QueuePush(Queue* pQ, QueueData x)
{assert(pQ);QueueNode* pnew = (QueueNode*)malloc(sizeof(QueueNode));assert(pnew);pnew->val = x;pnew->next = NULL;if (pQ->size == 0){pQ->pend = pQ->phead = pnew;}else{pQ->pend->next = pnew;pQ->pend = pnew;}pQ->size++;
}
QueueData QueueFront(Queue* pQ)
{assert(pQ);assert(pQ->size);return pQ->phead->val;
}
void QueuePop(Queue* pQ)
{assert(pQ);QueueData ret = pQ->phead->val;if (pQ->size == 1){free(pQ->phead);pQ->pend = pQ->phead = NULL;}else{QueueNode* pn = pQ->phead;pQ->phead = pQ->phead->next;free(pn);}pQ->size--;return ret;
}
int QueueSize(Queue* pQ)
{assert(pQ);return pQ->size;
}
bool QueueEmpty(Queue* pQ)//判空
{assert(pQ);return pQ->size;
}
void QueueDestroy(Queue* pQ)
{assert(pQ);while (pQ->phead){QueueNode* pnext = pQ->phead->next;free(pQ->phead);pQ->phead=pnext;}pQ->pend = pQ->phead = NULL;pQ->size = 0;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
int main()
{Queue ps;QueueInit(&ps);int n = 10;while (n--)QueuePush(&ps, n + 1);while (QueueEmpty(&ps)){printf("%d ",QueueFront(&ps));QueuePop(&ps);}QueueDestroy(&ps);return 0;
}

相关文章:

队列(详解)

一.队列的概念 队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;它按照先进先出的原则管理数据。这意味着最先进入队列的元素将被最先移出队列&#xff0c;类似于现实生活中排队的场景。 在队列中&#xff0c;数据项被添加到队列的一端&#xff0c;称为队尾…...

【原创】nnUnet V1在win11下的安装与配置

安装之前可以先了解一下论文的主要内容&#xff0c;便于之后网络训练与推理&#xff0c;调试程序。 论文地址&#xff1a;nnU-Net: a self-configuring method for deep learning-based biomedical image segmentation | Nature Methods 也可以从其他博客快速浏览&#xff1a…...

C语言之指针初阶

目录 前言 一、内存与地址的关系 二、指针变量 三、野指针 四、const 五、传值调用与传址调用 总结 前言 本文主要介绍C语言指针的一些基础知识&#xff0c;为后面深入理解指针打下基础&#xff0c;因此本文内容主要包括内存与地址的关系&#xff0c;指针的基本语法&…...

异常检测的学习和实战

1.应用&#xff1a; 1.在工业上的应用 当检测设备是否处于异常工作状态时&#xff0c;可以由上图分析得到&#xff1a;那些零散的点对应的数据是异常数据。因为设备大多数时候都是处于正常工作状态的&#xff0c;所以数据点应该比较密集地集中在一个范围内&#xff0c;而那些明…...

RabbitMQ 面试题(一)

1. 简述为什么要使用 RabbitMQ ? 使用 RabbitMQ 的主要原因包括以下几点&#xff1a; 解耦&#xff1a;在复杂的系统中&#xff0c;不同的服务或组件之间往往需要通信和协作。RabbitMQ 作为消息队列&#xff0c;允许这些组件或服务通过发送和接收消息来交互&#xff0c;而无…...

org.postgresql.util.PSQLException: 错误: 关系 “dual“ 不存在

springboot 项目连接 postgreps&#xff0c;启动时报错 org.postgresql.util.PSQLException: 错误: 关系 "dual" 不存在。 查阅资料后发现这是由配置文件中的配置 datasource-dynamic-druid-validationQuery 导致的 spring:datasource:druid:stat-view-servlet:ena…...

mysql权限分类

USAGE --无权限,只有登录数据库,只可以使用test或test_*数据库 ALL --所有权限 select/update/delete/super/slave/reload --指定的权限 with grant option --允许把自己的权限授予其它用户(此用户拥有建立账号的权限) 权限级别&#xff1a; 1、. &#xff0d;&#xff0d;全…...

【C++11】列表初始化、右值引用的详细讲解(上)

前言 在一开始学C之前我们就简单的了解了一下C的发展历史。 相比较而言&#xff0c;C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全&#xff0c;不仅功能更强大&#xff0c;而且能提升程序员的开发效率加了许多特性&#xff0c;约140个新特性。使得C…...

【JAVA进阶篇教学】第十三篇:Java中volatile关键字讲解

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第十三篇&#xff1a;volatile关键字讲解。 在 Java 中&#xff0c;volatile关键字是一种轻量级的同步机制&#xff0c;用于确保变量的可见性和禁止指令重排序。本文将详细解释volatile关键字的工作原理、可见性保证以及…...

蓝桥杯-地宫取宝

X 国王有一个地宫宝库&#xff0c;是 nm 个格子的矩阵&#xff0c;每个格子放一件宝贝&#xff0c;每个宝贝贴着价值标签。 地宫的入口在左上角&#xff0c;出口在右下角。 小明被带到地宫的入口&#xff0c;国王要求他只能向右或向下行走。 走过某个格子时&#xff0c;如果那个…...

带头单链表 C++实现

节点定义 带头单链表&#xff1a;我们只需要一个结点指针指向整个链表的第一个节点&#xff0c;这样我们就可以通过next指针访问整个链表内的所有节点 template<class T> struct ListNode {T _val;ListNode* _next;ListNode(const T &val):_val(val),_next(nullptr){…...

学习c#第24天 枚举类型

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace enumType { //定义枚举 public enum Week { 星期一, 星期二, 星期三, 星期四, 星期…...

TensorFlow运行bug汇总

1、ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1 解决方案 pip install urllib31.26.15 -i https://pypi.tuna.tsinghua.edu.cn/simple 升级或者降级 (TF2.1) C:\Users\Administrator>pip install urllib31.26.15 -i https://pypi.tuna.tsinghua.edu.cn/sim…...

docker部署调度程序

Dockerfile(构建初始镜像) # python:3.8-slim-buster为精简版的python FROM python:3.8-slim-buster # 1059为组的id,newgroup为组名,1088为用户的id,newuser为新用户 RUN groupadd -g 1059 newgroup && \useradd -g -u 1088 -g newgroup -m newuser USER newuser RUN…...

websocket和http协议的区别

ws(websocket)协议和http协议是两种不同的协议。 http&#xff1a;http是一种用于传输超文本的应用层协议&#xff0c;通常用于web端浏览器和web端服务器之间传输数据。http也是基于tcp的&#xff0c;但是HTTP只能在同一时刻单向发送消息&#xff0c;是一种半双工通信。&#…...

CSS之定位

目录 CSS定位为什么需要定位定位组成定位的叠放顺序拓展 CSS定位 为什么需要定位 浮动可以让多个块级盒子一行没有缝隙排列显示&#xff0c;经常用于横向排列盒子定位则是可以让盒子自由的在某个盒子内移动位置或者固定屏幕中的某个位置&#xff0c;并且可以压住其他盒子 定…...

[IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

解决办法&#xff1a; 安装驱动 下载 ODBC Driver for SQL Server - ODBC Driver for SQL Server | Microsoft Learn...

神经网络复习--神经网络算法模型及BP算法

文章目录 神经网络模型的构成BP神经网络 神经网络模型的构成 三种表示方式&#xff1a; 神经网络的三要素&#xff1a; 具有突触或连接&#xff0c;用权重表示神经元的连接强度具有时空整合功能的输入信号累加器激励函数用于限制神经网络的输出 感知神经网络 BP神经网络 …...

【Java】/*方法的使用-快速总结*/

目录 一、什么是方法 二、方法的定义 三、实参和形参的关系 四、方法重载 五、方法签名 一、什么是方法 Java中的方法可以理解为C语言中的函数&#xff0c;只是换了个名称而已。 二、方法的定义 1. 语法格式&#xff1a; public static 返回类型 方法名 (形参列表) { //方…...

kotlin中协程相关

协程 用同步的方式写出异步的效果协程最重要的是通过非阻塞挂起和恢复实现了异步代码的同步编写方式挂起函数(suspend)不一定就是在子线程中执行的&#xff0c;但是通常在定义挂起函数时都会为它指定其他线程&#xff0c;这样挂起才有意义解决多层嵌套回调 协程不是线程&…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...