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

数据结构队列的实现

在这里插入图片描述
本章介绍数据结构队列的内容,我们会从队列的定义以及使用和OJ题来了解队列,话不多说,我们来实现吧

队列

1。队列的概念及结构
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。
我们来看一下下面的这张图,让我们更好的理解它
在这里插入图片描述
我们从队尾入,队头出,只能是这样入栈和出栈

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

那队列的实现我们是用链式结构来实现的,因为用数组下标的话,出栈的时候要往前挪动数据,会更麻烦,这样队列的意义就下降了,所以我们这里用的方法是链式结构。

typedef int QueueDataType;
typedef struct QueueNode
{QueueDataType* next;QueueDataType data;
}QueueNode;typedef struct Queue
{QueueDataType* head;QueueDataType* tail;
}Queue;

这里我们定义的结构体Queue有很大的作用,因为队列不是像单链表那样,队列是有它的特点的,其中最大的一个特点就是入栈只能从尾入,出栈就是头出,所以我们在这里定义head和tail有很大的作用,定义在结构体当中会方便不少,那我们现在继续往下看我们的接口函数吧。

给大家看一下下面实现队列的接口函数,然后我们一步一步的来实现他们

// 初始化队列
void QueueInit(Queue* q);
// 队尾入队列
void QueuePush(Queue* q, QueueDataType data);
// 队头出队列
void QueuePop(Queue* q);
// 获取队列头部元素
QueueDataType QueueFront(Queue* q);
// 获取队列队尾元素
QueueDataType QueueBack(Queue* q);
// 获取队列中有效元素个数
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
bool QueueEmpty(Queue* q);
// 销毁队列
void QueueDestroy(Queue* q);

队列的初始化

void QueueInit(Queue* q); 

初始化我们初始的是结构体Queue中的内容

void QueueInit(Queue* q)
{assert(q);q->head = q->tail = NULL;
}

首先要判断传过来的指针是否是为空,然后将头指针和尾指针都置为NULL。

销毁队列

void QueuePush(Queue* q, QueueDataType data)

首先我们要创造一个节点将它放入,创造节点的结构体就是QueueNode,然后我们要更新后面节点中的head和tail,这里大家肯定有疑问,我们竟然是更新指针,那我们应该传指针的地址才能起到作用,一级指针只能改变结构体的内容,那我们在这里传的话,难道不会产生问题吗?答案是不会,我们的结构体中放的就是指针,那我们只需要改变结构体的内容,就是head和tail就行,竟然是这样的话,我们传一个一级指针就可以起到我们的作用,所以传的是一级,那现在我们在插入函数中先创造一个节点,因为只能从队列的尾插入,而且有了这个指针,我们就不需要像单链表那样再去找尾,我们每次插入都会更新尾。

void QueuePush(Queue* q, QueueDataType data)
{assert(q);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){printf("malloc fail\n");exit(-1);}newnode->data = data;newnode->next = NULL;if (q->head == NULL){q->head = q->tail = newnode;}else{q->tail->next = newnode;q->tail = newnode;}
}

有了入栈就有出栈,出栈的话是从我们的队列最开始的地方出队,我们来实现一下吧!

void QueuePop(Queue* q)
{assert(q);assert(!QueueEmpty(q));QueueNode* headnext = q->head->next;free(q->head);q->head = headnext;}
/

这里的空是因为如果我们的队列都是空的话,我们哪里还有数据进行删除呢
所以要先检查一下是不是为空,那接着我们把这个函数也实现一下吧

bool QueueEmpty(Queue* q)
{assert(q);return q->head == NULL;
}

这个很好理解,如果为空就代表一个数也没有,那我们就不能再对队列进行操作了,那再来看我们下面的接口函数吧。

// 获取队列头部元素
QueueDataType QueueFront(Queue* q)
{assert(q);return q->head->data;
}

有头就有尾,希望我们的人生也是
那我再来实现一下取尾的接口吧

QueueDataType QueueBack(Queue* q)
{assert(q);return q->tail->data;
}

我们继续往下走,实现一下我们后面的接口函数,这些基本上都很简单,我就也不再解释了,看代码就能理解的

int QueueSize(Queue* q)
{assert(q);int count = 0;QueueNode* cur = q->head;while (cur){count++;cur = cur->next;}return count;
}

销毁队列

void QueueDestroy(Queue* q)
{while (!QueueEmpty(q)){QueueNode* headnext = q->head->next;free(q->head);q->head = headnext;}}

统计我们队列节点的数量我们遍历一遍就可以实现了,定义一个cur指针进行遍历,那其他的我们也都讲完了,后面分享栈和队列的OJ题给大家,看完之后对队列有了更深的理解

完整代码

#include"Queue.h"// 初始化队列
void QueueInit(Queue* q)
{assert(q);q->head = q->tail = NULL;
}
// 队尾入队列
void QueuePush(Queue* q, QueueDataType data)
{assert(q);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){printf("malloc fail\n");exit(-1);}newnode->data = data;newnode->next = NULL;if (q->head == NULL){q->head = q->tail = newnode;}else{q->tail->next = newnode;q->tail = newnode;}
}
// 队头出队列
void QueuePop(Queue* q)
{assert(q);assert(!QueueEmpty(q));QueueNode* headnext = q->head->next;free(q->head);q->head = headnext;}
// 获取队列头部元素
QueueDataType QueueFront(Queue* q)
{return q->head->data;
}
// 获取队列队尾元素
QueueDataType QueueBack(Queue* q)
{return q->tail->data;
}
// 获取队列中有效元素个数
int QueueSize(Queue* q)
{assert(q);int count = 0;QueueNode* cur = q->head;while (cur){count++;cur = cur->next;}return count;
}
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
bool QueueEmpty(Queue* q)
{assert(q);return q->head == NULL;
}
// 销毁队列
void QueueDestroy(Queue* q)
{while (!QueueEmpty(q)){QueueNode* headnext = q->head->next;free(q->head);q->head = headnext;}}

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int QueueDataType;
typedef struct QueueNode
{QueueDataType* next;QueueDataType data;
}QueueNode;typedef struct Queue
{QueueDataType* head;QueueDataType* tail;
}Queue;// 初始化队列
void QueueInit(Queue* q);
// 队尾入队列
void QueuePush(Queue* q, QueueDataType data);
// 队头出队列
void QueuePop(Queue* q);
// 获取队列头部元素
QueueDataType QueueFront(Queue* q);
// 获取队列队尾元素
QueueDataType QueueBack(Queue* q);
// 获取队列中有效元素个数
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
bool QueueEmpty(Queue* q);
// 销毁队列
void QueueDestroy(Queue* q);

今天的分享就到这里了,我们下次再见

相关文章:

数据结构队列的实现

本章介绍数据结构队列的内容&#xff0c;我们会从队列的定义以及使用和OJ题来了解队列&#xff0c;话不多说&#xff0c;我们来实现吧 队列 1。队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;…...

Gti的基本介绍和使用方式

Git 是一种分布式版本控制系统, 主要用于管理软件开发过程中的代码变更。其基本概念包括: 仓库 (Repository): Git中存储代码的基本单位&#xff0c;即一个代码库。在仓库中可以存储多个分支、标签、提交记录等。 分支 (Branch): Git中的分支是代码的不同开发方向&#xff0c;…...

剑指Offer 24-反转链表

题目描述&#xff1a;定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 解题思路&#xff1a; 这道题做过很多次&#xff0c;还是会…...

小研究 - Java虚拟机即时编译器的一种实现原理

深入分析了 &#xff2b;&#xff41;&#xff46;&#xff46;&#xff45;虚拟机的 &#xff2a;&#xff29;&#xff34;&#xff08;&#xff2a;&#xff55;&#xff53;&#xff54;&#xff0d;&#xff29;&#xff4e;&#xff0d;&#xff34;&#xff49;&#xf…...

【LeetCode】416.分割等和子集

题目 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和 [11] 。 示…...

go vet中的那些检测项

go vet 是 Go 语言自带的一个工具&#xff0c;用于分析 Go 代码中的常见错误和潜在问题。它可以检查代码中可能存在的各种问题&#xff0c;例如&#xff1a; 未使用的变量、函数或包 可疑的函数调用 错误的函数签名 程序中的竞态条件 错误的类型转换等 本文意图指令当前go vet所…...

Qt 自定义菜单、右键菜单

在接触Qt这段时间以来&#xff0c;经常遇到菜单项的问题&#xff08;右键菜单、托盘菜单、按钮菜单等&#xff09;&#xff0c;QMenu用于菜单栏,上下文菜单,弹出菜单等&#xff0c;利用QMenuQAction就可以达到效果&#xff01; 右键菜单实现&#xff1a;通过重写contextMenuEv…...

VScode 编辑器报错: ‘HelloWorld‘ is declared but its value is never read.

.vue文件被标识红色波浪线&#xff1b;提示&#xff1a; HelloWorld is declared but its value is never read. 问题原因&#xff1a; 因为vue3已经不支持vetur插件。 1、在扩展里面进行搜索Vetur插件&#xff0c;进行禁用或卸载&#xff1b; 2、在 VScode扩展里面搜索并下载…...

如何使用LLM实现文本自动生成视频

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 介绍 基于扩散的图像生成模型代表了计算机视觉领域的革命性突破。这些进步由Imagen&#xff0c;DallE和MidJourney等模型开创&#xff0c;展示了文本条件图像生成的卓越功能。有关这些模型内部工作的…...

Rust处理JSON

基本操作 Cargo.toml: [package]name "json"version "0.1.0"edition "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]serde { version "1", features …...

Python如何操作网络爬虫

Python是一种非常强大的编程语言&#xff0c;用于网络爬虫操作也非常方便。Python提供了许多用于构建和操作网络爬虫的库和工具&#xff0c;如BeautifulSoup、Scrapy、Requests等。本文将详细介绍Python如何操作网络爬虫。 一、安装相关库 首先&#xff0c;我们需要安装Python…...

linux文件复制覆盖命令

目录 cp 命令参数2.cp -rf 出现复制不覆盖文件问题3.解决文件复制覆盖提示操作问题&#xff0c;以下四种方式&#xff0c;供大家参考使用。方法1&#xff1a;编写带cp的路径复制覆盖文件方法2&#xff1a;在CP命令前面加一个斜杠\&#xff0c;实现强制覆盖文件方法3&#xff1a…...

modbus概览

modbus Modbus是Modicon&#xff08;施耐德&#xff09;公司于1979年开发的串行通信协议。它最初设计用于公司的可编程逻辑控制器&#xff08;PLC&#xff09;。 Modbus是一种开放式协议&#xff0c;支持使用RS232/RS485/RS422协议的串行设备&#xff0c;同时还支持调制解调器…...

KMP算法开荒

文章目录 一 、前言二、 暴力解法三、KMP算法原理3.1 自动子串的指针3.2 跳过多少个字符3.3 next数组 - 暴力3.4 next数组 - 求解 四 KMP实现 一 、前言 字符串匹配 import re print(re.search(www, www.runoob.com).span()) # 在起始位置匹配 print(re.search(com, www.run…...

XXL-JOB(2)

Glue模式 任务以源码的形式去维护调度中心&#xff0c;支持实时编译&#xff0c;无需指定JobHandler。 实际上是继承自JobHandler的java类代码&#xff0c;在执行器中运行&#xff0c;可以使用Resource/Autowire注入执行器里中的其他服务. 在执行器中添加service Service p…...

Linux常用命令_网络命令、关机重启命令

文章目录 1. 网络命令1.1 网络命令: write1.2 网络命令: wall1.3 网络命令: ping1.4 网络命令: ifconfig1.5 网络命令: mail1.6 网络命令: last1.7 网络命令: lastlog1.8 网络命令: traceroute1.9 网络命令: netstat1.10 网络命令: setup1.11 挂载命令 2. 关机重启命令2.1 shut…...

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part I

用Cmake build OpenCV后&#xff0c;在VS中查看OpenCV源码的方法 Part I 写在最前面&#xff0c;最近这段时间的工作需要用opencv&#xff0c;不仅是调包&#xff0c;还要能够看到opencv的源码。然后就跟着网上的教程实现了一遍&#xff0c;在实现过程中&#xff0c;遇到了不少…...

如何使用Docker搭建ZooKeepe集群

1、拉取镜像 # docker pull zookeeper:3.7.12、创建网络 Docker创建容器时默认采用bridge网络&#xff0c;自行分配ip&#xff0c;不允许自己指定。在实际部署中&#xff0c;需要指定容器ip&#xff0c;不允许其自行分配ip&#xff0c;尤其在搭建集群时。可以通过docker netw…...

【javaweb】学习日记Day3 - Ajax 前后端分离开发 入门

目录 一、Ajax 1、简介 2、Axios &#xff08;没懂 暂留&#xff09; &#xff08;1&#xff09;请求方式别名 &#xff08;2&#xff09;发送get请求 &#xff08;3&#xff09;发送post请求 &#xff08;4&#xff09;案例 二、前端工程化 1、Vue项目-目录结构 2、…...

SQL注入漏洞复现:探索不同类型的注入攻击方法

这篇文章旨在用于网络安全学习&#xff0c;请勿进行任何非法行为&#xff0c;否则后果自负。 准备环境 sqlilabs靶场 安装&#xff1a;详细安装sqlmap详细教程_sqlmap安装教程_mingzhi61的博客-CSDN博客 一、基于错误的注入 注入讲解 介绍 基于错误的注入&#xff08;Err…...

大彩串口屏使用记录

写在最前面 屏幕型号 DC10600M070 IDE VisualTFT&#xff08;官方&#xff09; VSCode&#xff08;lua编程&#xff09; 用之前看一下官方那个1小时的视频教程就大概懂控件怎么用了&#xff0c;用官方的软件VisualTFT很简单 本文只是简单记录遇到的一些坑 lua编辑器 VisualTF…...

Qt http 的认证方式以及简单实现

http 的认证方式 基本认证&#xff08;Basic Authentication&#xff09;: 基本认证是最简单的HTTP认证方式。客户端在请求头中使用Base64编码的用户名和密码进行身份验证由于仅使用Base64编码&#xff0c;基本认证并不安全&#xff0c;因此建议与HTTPS一起使用&#xff0c;以…...

【图像分割】实现snake模型的活动轮廓模型以进行图像分割研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【MongoDB系列】1.MongoDB 6.x 在 Windows 和 Linux 下的安装教程(详细)

本文主要介绍 MongoDB 最新版本 6.x 在Windows 和 Linux 操作系统下的安装方式&#xff0c;和过去 4.x 、5.x 有些许不同之处&#xff0c;供大家参考。 Windows 安装 进入官网下载 Mongodb 安装包&#xff0c;点此跳转&#xff0c;网站会自动检测当前操作系统提供最新的版本&…...

5.网络原理之初识

文章目录 1.网络发展史1.1独立模式1.2网络互连1.3局域网LAN1.3.1基于网线直连1.3.2基于集线器组建1.3.3基于交换机组建1.3.4基于交换机和路由器组建1.3.4.1路由器和交换机区别 1.4广域网WAN 2.网络通信基础2.1IP地址2.2端口号2.3认识协议2.4五元组2.5 协议分层2.5.1 分层的作用…...

【Linux】进程状态|僵尸进程|孤儿进程

前言 本文继续深入讲解进程内容——进程状态。 一个进程包含有多种状态&#xff0c;有运行状态&#xff0c;阻塞状态&#xff0c;挂起状态&#xff0c;僵尸状态&#xff0c;死亡状态等等&#xff0c;其中&#xff0c;阻塞状态还包含深度睡眠和浅度睡眠状态。 个人主页&#xff…...

ASEMI快恢复二极管APT80DQ60BG特点应用

编辑-Z APT80DQ60BG参数描述&#xff1a; 型号&#xff1a;APT80DQ60BG 最大峰值反向电压(VRRM)&#xff1a;600V 最大直流阻断电压VR(DC)&#xff1a;600V 平均整流正向电流(IF)&#xff1a;80A 非重复峰值浪涌电流(IFSM)&#xff1a;600A 工作接点温度和储存温度(TJ, …...

【Python爬虫】使用代理ip进行网站爬取

前言 使用代理IP进行网站爬取可以有效地隐藏你的真实IP地址&#xff0c;让网站难以追踪你的访问行为。本文将介绍Python如何使用代理IP进行网站爬取的实现&#xff0c;包括代理IP的获取、代理IP的验证、以及如何把代理IP应用到爬虫代码中。 1. 使用代理IP的好处 在进行网站爬…...

识别图片中的文字

前言 PearOCR 是一款免费无限制网页版文字识别工具。 优点如下&#xff1a; 免费&#xff1a;完全免费&#xff0c;没有任何次数、大小限制&#xff0c;可以无限使用&#xff1b; 安全&#xff1a;全部数据本地运算&#xff0c;所有图片均不会被上传&#xff1b; 智能&#xf…...

第七章:借阅管理【基于Servlet+JSP的图书管理系统】

借阅管理 1. 借书卡 1.1 查询借书卡 借书卡在正常的CRUD操作的基础上&#xff0c;我们还需要注意一些特殊的情况。查询信息的时候。如果是管理员则可以查询所有的信息&#xff0c;如果是普通用户则只能查看自己的信息。这块的控制在登录的用户信息 然后就是在Dao中处理的时候需…...

wordpress php版本更改/湖南官网网站推广软件

jQuery创建、删除、添加元素 1、创建元素 2、添加元素 内部添加&#xff1a; 外部添加&#xff1a; 3、删除元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&qu…...

wordpress自动添加关键字/免费推广网站入口

有人曾问&#xff0c;如何正确估算项目周期&#xff1f;你是天天写C#程序的程序员&#xff0c;若做了一个 PHPwind 的单点登录&#xff0c;那估计需要几天时间&#xff1f;客户只提了一个需求&#xff0c;门户网站需要与 PHPwind 需要有单点登录功能&#xff0c;问你多长时间能…...

设计一个电子商务网站建设方案/公司如何在百度宣传

cuisine[英][kwɪˈzi:n] [美][kwɪˈzin] n.烹饪&#xff0c;烹调法&#xff1b;菜肴 walnut[英][ˈwɔ:lnət] [美][ˈwɔlˌnʌt, -nət] n.胡桃&#xff08;树&#xff09;&#xff1b;胡桃木&#xff1b;胡桃木色 broccoli[英][ˈbrɔkəli:] [美][ˈbrɑkəli] n.花椰菜&…...

网络优化公司网站代码/电商运营助理

文章目录1. 安装2. 插桩3. Quick Startcorpus基本使用输出多线程字典崩溃分析4. 用户手册如何查看结果如何配置&#xff08;环境变量&#xff09;多线程5. Using ASAN with AFL6. TipsFuzz优化7. More about AFLAFL原理8. Demo9. 其它参考资料官方文档&#xff1a;https://afl-…...

东莞清洁服务网站建设/关键词优化的作用

首先&#xff0c;关注破千了&#xff0c;感谢大家的支持。D2-Net A Trainable CNN for Joint Description and Detection of Local Featureshttps://arxiv.org/pdf/1905.03561.pdf​arxiv.org一、论文出发点传统的关键点检测&#xff0c;例如&#xff33;&#xff29;&#xf…...

网站动图banner怎么做/如何优化网络环境

一、H3C 交换机密码配置一、CONSOLE口登陆在AUX用户接口视图下&#xff0c;可以设置CONSOLE用户登陆的口令认证。有如下三种认证方式None:不需要口令认证Password&#xff1a;需要简单的本地口令认证&#xff0c;包含明文(simple)和密文&#xff08;cipher&#xff09;Scheme&a…...