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

【数据结构】—— 队列

    • 1、队列的概念
    • 2、队列的结构
      • 如何选择合适的数据结构实现队列(数组or链表)
    • 3、队列的链式存储
      • 3.1 队列的链式存储结构
      • 3.2 队列的常见接口
      • 3.3 队列的接口实现
        • 初始化
        • 判空
        • 入队列
        • 出队列
        • 获取队头元素
        • 获取队尾元素
        • 获取节点个数
        • 销毁
      • 3.4 源代码
    • 4、队列的顺序存储(循环队列)

1、队列的概念

队列是一种先进先出(First In First Out ,FIFO)的数据结构,可以简单理解为排队的概念。在队列中,数据项按照插入的顺序排列,并且只能在队列的一端插入(称为队尾),在另一端删除(称为队头)。

2、队列的结构

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

在这里插入图片描述

如何选择合适的数据结构实现队列(数组or链表)

在前面学习的顺序表中,我们知道数组只有在尾插和尾删效率高为O(1),当需要对头部元素操作时效率较低为O(n)。队列的特点是在队尾插入元素,在队头删除元素,序列两端都需要访问,这就导致使用数组实现队列时必定有一端的插入(or删除)效率低,因此不建议使用数组实现队列

3、队列的链式存储

通过上面的分析,我选择链式存储结构来实现队列。这是因为链式存储结构实现两端的高效访问很简单——只需要增加一个尾指针即可实现两端的O(1)访问

3.1 队列的链式存储结构

定义两个结构体

  • QNode:保存队列中节点的元素数据下一个节点
  • Queue:保存头指针尾指针队列中有效元素个数
typedef int QDateType;
typedef struct QueueNode
{QDateType val;//当前节点的数据struct QueueNode* next;//当前节点的下一个节点
}QNode;typedef struct Queue
{QNode* phead;//头指针QNode* ptail;//尾指针int size;//记录队列有效元素个数
}Queue;

3.2 队列的常见接口

//初始化
void QueueInit(Queue* pq);
//销毁
void QueueDestroy(Queue* pq);//入队列
void QueuePush(Queue* pq,QDateType x);//出队列
void QueuePop(Queue* pq);
//获取队头元素
QDateType QueueFront(Queue* pq);
//获取队尾元素
QDateType QueueBack(Queue* pq);
//判空
bool QueueEmpty(Queue* pq);
//获取有效元素个数
int QueueSize(Queue* pq);

3.3 队列的接口实现

初始化

头尾指针置空,队列有效元素个数初始化为0

void QueueInit(Queue* pq)
{assert(pq);//哨兵位可选可不选(可以有也可以没有)pq->phead = pq->ptail = NULL;pq->size = 0;
}
判空

直接返回Queue结构体保存的size即可

bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}
入队列

队尾入队步骤

(1)申请新节点并初始化该节点(将x赋值,下一个节点置空)
(2)判断是否存在尾节点(队列是否为空

  • 存在尾节点(队列不为空):只需将新节点接到队尾,尾指针后移一位即可。
  • 不存在尾节点(队列为空):改变队头和队尾的值即可

(3)队列有效节点个数加1

void QueuePush(Queue* pq, QDateType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));//申请新节点if (newnode == NULL){perror("malloc fail");return;}//对新节点初始化newnode->val = x;newnode->next = NULL;//有尾节点(队列不为空)if (pq->ptail){pq->ptail->next = newnode;pq->ptail = newnode;}else{//一个有效节点都没(队列为空)pq->phead = pq->ptail = newnode;}pq->size++;
}
出队列

(1)判空(队列不为空才能出队)
(2)判断队列有效节点的个数

  • 一个节点:释放该节点,将头尾指针置空
  • 多个节点:定义临时QNode类型变量保存头节点的下一个节点,释放头节点,头节点更新为保存的节点

(3)队列有效节点个数减1

void QueuePop(Queue* pq)
{assert(pq);//三种情况:0个节点,1个节点,多个节点//0个assert(pq->phead);//暴力检查//if (pq->phead == NULL) return;//温柔检查//队列只有1个有效节点if (pq->phead->next==NULL){free(pq->phead);pq->phead = pq->ptail = NULL;}else{//队列有多个有效节点QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}
获取队头元素

断言判断是否存在头节点,如果存在直接返回头节点的值即可

QDateType QueueFront(Queue* pq)
{assert(pq);//这里只能暴力检查assert(pq->phead);return pq->phead->val;
}
获取队尾元素

断言判断是否存在尾节点,如果存在直接返回尾节点的值即可

QDateType QueueBack(Queue* pq)
{assert(pq);//这里只能暴力检查assert(pq->ptail);return pq->ptail->val;
}
获取节点个数

返回size即可

int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
销毁

遍历删除(释放)所有节点,最后头尾指针悬空,size置0

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

3.4 源代码

.h文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int QDateType;typedef struct QueueNode
{QDateType val;struct QueueNode* next;
}QNode;
入队
为什么需要两个指针
//void QueuePush(QNode** head,QNode** ptail);
//
出队
//void QueuePop(QNode** head);typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//初始化
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);//入队列
void QueuePush(Queue* pq,QDateType x);//出队列
void QueuePop(Queue* pq);QDateType QueueFront(Queue* pq);
QDateType QueueBack(Queue* pq);
bool QueueEmpty(Queue* pq);
int QueueSize(Queue* pq);

.c文件

#include "Queue.h"//初始化
void QueueInit(Queue* pq)
{assert(pq);//哨兵位可选可不选pq->phead = pq->ptail = NULL;pq->size = 0;
}
//销毁
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}//入队列
void QueuePush(Queue* pq, QDateType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;//有尾节点if (pq->ptail){pq->ptail->next = newnode;pq->ptail = newnode;}else{//一个有效节点都没pq->phead = pq->ptail = newnode;}pq->size++;
}//出队列
void QueuePop(Queue* pq)
{assert(pq);//三种情况:0个节点,1个节点,多个节点//0个assert(pq->phead);//暴力检查//if (pq->phead == NULL) return;//温柔检查//1个if (pq->phead->next==NULL){free(pq->phead);pq->phead = pq->ptail = NULL;}else//多个{QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}QDateType QueueFront(Queue* pq)
{assert(pq);//这里只能暴力检查assert(pq->phead);return pq->phead->val;
}
QDateType QueueBack(Queue* pq)
{assert(pq);//这里只能暴力检查assert(pq->ptail);return pq->ptail->val;
}
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

4、队列的顺序存储(循环队列)

虽然队列的一般实现使用链式存储,但是也有一些情况可以使用数组存储,比如循环队列。
具体可以查看这篇博客———循环队列OJ

END

相关文章:

【数据结构】—— 队列

1、队列的概念2、队列的结构如何选择合适的数据结构实现队列&#xff08;数组or链表&#xff09; 3、队列的链式存储3.1 队列的链式存储结构3.2 队列的常见接口3.3 队列的接口实现初始化判空入队列出队列获取队头元素获取队尾元素获取节点个数销毁 3.4 源代码 4、队列的顺序存储…...

vue中openlayers过滤高亮显示某个图层

vue中openlayers过滤高亮显示某个图层 openlayers库没有直接支持这样设置&#xff0c;所以可以使用库&#xff1a;ol-ext&#xff0c;地址&#xff1a;https://viglino.github.io/ol-ext/examples/filter/map.filter.crop.html 效果&#xff1a; 关键代码&#xff1a; /**…...

WPF篇(11)-ToolTip控件(提示工具)+Popup弹出窗口

ToolTip控件 ToolTip控件继承于ContentControl&#xff0c;它不能有逻辑或视觉父级&#xff0c;意思是说它不能以控件的形式实例化&#xff0c;它必须依附于某个控件。因为它的功能被设计成提示信息&#xff0c;当鼠标移动到某个控件上方时&#xff0c;悬停一会儿&#xff0c;…...

【mysql 第一篇章】系统和数据库的交互方法

一、宏观的查看系统怎么和数据库交互 在我们刚刚接触系统和数据库的时候不明白其中的原理&#xff0c;只知道系统和数据库是需要交互的。所以我们会理解成上图的形式。 二、MYSQL 驱动 随着我们的学习时间的加长以及对程序的了解&#xff0c;发现链接数据库是需要有别的工具辅…...

数据结构-位运算总结

位运算总结&#xff1a; 1.求位1的个数 191. 位1的个数 - 力扣&#xff08;LeetCode&#xff09; 有两种写法&#xff1a; 1.是把该数不断的去与0x1相与&#xff0c;得到该数的最后一位的值&#xff0c;然后判断他是不是1&#xff0c;再把该数更新一下整体往后移动一位也就…...

java 异常堆栈的由来

编写的程序代码内部错误产生的异常&#xff0c;如调用对象为空(空指针异常)、数组越界异常、除0异常等。这种通常称为未检查的异常&#xff08;Runtime异常子类&#xff09;&#xff0c;在虚拟机中执行时会集中处理这些异常。其他运行中异常&#xff0c;通过throw语句主动抛出的…...

【推荐系统】【多任务学习】Progressive Layered Extraction (PLE)

Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations 文章目录 Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations1 论文出处2 背景2.1 背景介…...

java -转win32/win64免安装jre环境运行

由于java 转为exe&#xff0c;只能在装有JDK环境的电脑运行&#xff0c; 发给其他人也不能运行&#xff0c;缺少环境&#xff0c;程序自己背着jre走 1.先打好jar 包 2.使用exe4j 把jar包转成exe 运行程序 3.使用inno stup &#xff0c;把exe运行程序加上jre环境 以下是具体实现…...

算法板子:容斥原理——求出 1∼n 中能被质数 p1,p2,…,pm 中的至少一个数整除的整数有多少个

1. 题目要点 1. 设&#xff1a;求1~10中能被质数2和3中至少一个数整除的数有多少个。1~10中能被质数2整除的数的集合记为S1{2,4,6,8,10}&#xff0c;能被质数3整除的数的集合记为S2{3,6,9}&#xff0c;能同时被质数2和3整数的数的集合为S1∩S2{6} 2. 这道题的目的是求S1∪S2∪S…...

用gurobipy求解带不等式约束条件的优化问题

1. 引入 在当今的数据驱动世界中&#xff0c;优化问题无处不在&#xff0c;从工程设计到经济模型&#xff0c;再到机器学习算法的调参&#xff0c;优化都是实现效率最大化、成本最小化或性能最优化的关键工具。 这里有一个典型的数学优化问题&#xff0c;目标是在给定的约束条…...

漏洞复现-Adobe ColdFusion 远程代码执行漏洞(CVE-2023-38203)

1.漏洞描述 Adobe ColdFusion是一种服务器端的Web应用开发平台。它由Adobe Systems开发&#xff0c;用于创建动态的、交互式的Web应用程序和网站。 Adobe ColdFusion在2018u17及之前版本、2021u7及之前版本和2023u1及之前版本中存在任意代码执行漏洞。该漏洞是由于反序列化不…...

Spring-MyBatis整合:No qualifying bean of type ‘XXX‘ available: ...

1.看一下核心配置中有没有导入myBatis配置 2.看一下service和dao有没有相应注解 3.看一下MyBatisConfig中有没有对sqlSessionFactory和mapperScannerConfigurer注释成bean对象以及有没有配置映射文件路径...

gitea docker 快捷安装部署

前言 在前一篇博文&#xff08;什么是 Gitea&#xff1f;&#xff09;中&#xff0c;我们详细介绍了gitea的功能特性&#xff0c;以及其与其它git服务器之间的特性多维度对比。 在本文中&#xff0c;我们将详细介绍gitea的快捷安装部署&#xff0c;docker方式&#xff01; 1…...

CLAMP-1

一、信息收集 1、主机发现 nmap 192.168.236.0/24 2、端口扫描 nmap 192.168.236.173 -p- -A 3、目录扫描 dirb http://192.168.236.173 二、漏洞探测 访问80端口 访问 /nt4stopc/ 下面有一些问题&#xff0c;提示必须收集答案 都是一些判断题&#xff0c;对与错对应1与0&…...

Blender的Python编程介绍

在Blender这个免费的开源3D设计软件中&#xff0c;最值得称道的一点是可以用Python程序来辅助进行3D设计&#xff0c;我们可以通过Python来调整物体的属性&#xff0c;生成新的物体&#xff0c;甚至生成新的动画等等。 在最近的一个项目中&#xff0c;我用Blender制作了一个动…...

树莓派4/5:运行Yolov5n模型(文末附镜像文件)

〇、前言 因国内网络问题&#xff0c;可直接烧录文末镜像文件&#xff0c;或者按照本教程进行手动操作。 一、实验目的 在树莓派4B运行Yolov5n模型。 二、实验条件 1、Windows 11计算机&#xff1a;安装了Mobaxterm 2、树莓派4B&#xff1a;64Bit Lite OS&#xff0c;安装了…...

【学习笔记】Day 9

一、进度概述 1、inversionnet_train 试运行——成功 二、详情 1、inversionnet_train 试运行 在经历了昨天的事故后&#xff0c;今天最终成功运行了 inversionnet_train&#xff0c;运行结果如下&#xff1a; 经观察&#xff0c;最开始 loss 值大概为 0.5 左右 随着训练量的增…...

Linux网络案例

网络配置基础 WIN10上安装虚拟机&#xff0c;虚拟机里安装CENTOS6.5。 1&#xff09;网络配置的步骤 &#xff08;1&#xff09;CENTOS6.5C网络设置: su root //切换root用户 cd /etc/sysconfig/network-scripts //进入网卡配置文件所在目录 vi ifcfg-eth0 //修改网卡配置文件 …...

苹果离线打包机配置和打包

1、虚拟机安装 macOS虚拟机安装全过程&#xff08;VMware&#xff09;-腾讯云开发者社区-腾讯云 给 windows 虚拟机装个 mac 雪之梦 1、安装苹果镜像 去网上下载&#xff0c;打包机的镜像要和自己mac电脑上的保持一致。 同时打包机的用户名也需要和自己的mac保持一致。 2、…...

【C++ Primer Plus】学习笔记 5【指针 下】

文章目录 前言一、指针1.使用new创建动态结构例子&#xff1a;使用new和delete 2.自动存储、静态存储和动态存储1.自动存储2.静态存储3.动态存储 总结 前言 依旧是指针部分ヾ(◍∇◍)&#xff89;&#xff9e; 一、指针 1.使用new创建动态结构 将new用于结构由两步组成:创建…...

LLM API安全攻防实战:从提示词注入到自动化测试方案

1. 项目概述&#xff1a;被忽视的LLM API安全前线最近在帮几个团队做上线前的安全审计&#xff0c;发现一个挺有意思的现象&#xff1a;大家对于传统API的鉴权、限流、SQL注入这些常规检查已经形成了肌肉记忆&#xff0c;但一旦涉及到LLM&#xff08;大语言模型&#xff09;的A…...

AI大模型应用开发全攻略:从入门到精通,掌握LLM、RAG、Agent核心技能!“

本文全面介绍了AI大模型应用开发的核心技术和实践。从大模型API交互基础&#xff0c;到关键参数Messages和Tools的作用&#xff0c;深入解析了RAG、ReAct、Agent等应用范式。文章还探讨了Fine-tuning微调和Prompt提示词工程的重要性&#xff0c;强调工程实践与业务需求相结合。…...

AI智能体到底强在哪?为什么大家开始从“养龙虾”转向“养马”

那么AI智能体的核心能力是什么&#xff1f; 1、理解需求 它能分析你的真实意图&#xff0c;而不是只看表面的文字&#xff0c;比如让它整理这个月的消费情况&#xff0c;它明白之后&#xff0c;会读取账单&#xff0c;做分类统计&#xff0c;生成总结&#xff0c;最后输出图表。…...

别再乱算相似度了!用Python实战二元变量聚类:从Jaccard系数到病人分组

医疗数据分析实战&#xff1a;用Python实现基于Jaccard系数的病人症状聚类在医疗数据分析领域&#xff0c;如何从海量病人症状数据中发现潜在规律一直是临床研究的难点。传统方法往往依赖医生经验或简单统计&#xff0c;而现代数据挖掘技术为我们提供了更科学的解决方案。本文将…...

机器学习与SHAP在教育公平研究中的应用:精准定位学业困境根源

1. 项目概述&#xff1a;当机器学习遇见教育公平&#xff0c;我们如何精准定位学业困境的根源&#xff1f;在拉丁美洲的教育研究领域&#xff0c;一个长期困扰政策制定者和研究者的核心问题是&#xff1a;究竟是什么因素&#xff0c;在复杂的社会经济背景下&#xff0c;系统性地…...

深度解析网络设备权限管理工具:中兴光猫工厂模式与Telnet服务完整指南

深度解析网络设备权限管理工具&#xff1a;中兴光猫工厂模式与Telnet服务完整指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 在当今网络设备管理领域&#xff0c;获取设备完整控制…...

【python】ImportError: DLL load failed while importing QtWidgets: 找不到指定的程序。重新安装后搞定

文章目录前言一、PyQt6引用后报错二、使用步骤总结前言 想做个好看的界面&#xff0c;引用了PyQt6&#xff0c;却产生了新问题。 pip install pyqt6-tools&#xff0c;优先做这个动作进行修复。 一、PyQt6引用后报错 python里引用&#xff1a; from PyQt6.QtWidgets import…...

LeagueAkari:英雄联盟终极自动化助手革命性指南

LeagueAkari&#xff1a;英雄联盟终极自动化助手革命性指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否在英雄联盟游戏中反复经历这…...

ComfyUI-WD14-Tagger:3分钟实现AI智能图像标签提取,效率提升10倍

ComfyUI-WD14-Tagger&#xff1a;3分钟实现AI智能图像标签提取&#xff0c;效率提升10倍 【免费下载链接】ComfyUI-WD14-Tagger A ComfyUI extension allowing for the interrogation of booru tags from images. 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-WD14-…...

3个实用场景教你轻松解锁网易云音乐NCM加密文件:ncmdumpGUI完整指南

3个实用场景教你轻松解锁网易云音乐NCM加密文件&#xff1a;ncmdumpGUI完整指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经下载了网易云音乐的…...