数据结构 --- 队列

队列概念

队列同栈一样,是一种特殊的数据结构,只允许在一端进行插入操作,在另一端进行删除操作,队列遵循先进先出原则。

进行插入操作的一端称为队尾,插入元素叫做入队

进行删除操作的一端称为队头,删除元素叫做出队


队列同栈一样,可以使用数组实现,也可以使用链表实现。

各接口实现

typedef int QDataType;typedef struct QueueNode
{struct QueueNode* ne;QDataType val;
}QNode;//队列节点typedef struct Queue
{QNode* head;//用于找到队头QNode* tail;//用于找到队尾int count;
}Queue;//队列的基本结构,void QuInit(Queue* ps);
void QuDestory(Queue* ps);void QuPush(Queue* ps, QDataType x);
void QuPop(Queue* ps);QDataType QuFront(Queue* ps);
QDataType QuBack(Queue* ps);bool QuEmpty(Queue* ps);
int QuSize(Queue* ps);

QuInit初始化和QuDestory销毁空间

void QuInit(Queue* ps)
{assert(ps);ps->head = ps->tail = NULL;ps->count = 0;
}

站的初始化很简单,将结构体中的内容初始化为NULL和0即可


void QuDestory(Queue* ps)
{assert(ps);QNode* cur = ps->head;while (cur){QNode* ne = cur->ne;free(cur);cur = ne;}ps->count = 0;ps->head = ps->tail = cur = NULL;
}

销毁空间,因为这个队列使用链表实现的并且开辟空间用的malloc函数,所以不能直接把head和tail给free了,这样不会把所有开辟的空间给释放,会造成内存泄漏。

QuPush入队和QuPop出队

void QuPush(Queue* ps, QDataType x)
{assert(ps);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->val = x;newnode->ne = NULL;if (ps->head == NULL){assert(ps->tail == NULL);ps->head = ps->tail = newnode;}else{ps->tail->ne = newnode;ps->tail = newnode;}ps->count++;
}

开辟空间的操作不多做解释。

在进行入队操作时,分两种情况,当head和tail都为NULL的时候,插入一个元素之后,队头和队尾其实是在同一个位置的。

另一种情况是,队内存在元素,这个时候,只需要把要入队的元素链接在队尾,然后让在移动tail指针,移动到链接之后的队尾即可。


void QuPop(Queue* ps)
{assert(ps);assert(ps->count);if (ps->head->ne == NULL){free(ps->head);ps->head = ps->tail = NULL;}else{QNode* cur = ps->head->ne;free(ps->head);ps->head = cur;}ps->count--;
}

出队的时候,要注意,队内没有元素的时候是能出队的。

如果说队内元素只有一个,那么直接free掉即可。反之,就需要先创建一个临时变量,用来记录一下队头的下一个元素,然后free掉队头,在让队头移动到临时变量的位置即可。

查看队头元素QuFront和QuBack查看队尾元素

这个很简单,只要队列不为空,直接返回队头指向的元素值即可

QDataType QuFront(Queue* ps)
{assert(ps);assert(ps->count);return ps->head->val;}

查看队尾元素同查看队头元素一样。

QDataType QuBack(Queue* ps)
{assert(ps);assert(ps->count);return ps->tail->val;
}

判断队列是否为空QuEmpty

bool QuEmpty(Queue* ps)
{assert(ps);assert(ps->count);return ps->head == NULL;
}

如果队列的头指针head为空,则队列为空,反之,则队列不为空

队列长度QuSize

在实现队列的时候,我们会用一个count,来记录队列的长度,在这里,直接把count当成返回值即可

int QuSize(Queue* ps)
{assert(ps);return ps->count;
}

源码

.h文件

#pragma once#include <iostream>
#include <stdlib.h>
#include <assert.h>using namespace std;typedef int QDataType;typedef struct QueueNode
{struct QueueNode* ne;QDataType val;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;int count;
}Queue;void QuInit(Queue* ps);
void QuDestory(Queue* ps);void QuPush(Queue* ps, QDataType x);
void QuPop(Queue* ps);QDataType QuFront(Queue* ps);
QDataType QuBack(Queue* ps);bool QuEmpty(Queue* ps);
int QuSize(Queue* ps);

.cpp文件

#include "queue.h"void QuInit(Queue* ps)
{assert(ps);ps->head = ps->tail = NULL;ps->count = 0;
}void QuDestory(Queue* ps)
{assert(ps);QNode* cur = ps->head;while (cur){QNode* ne = cur->ne;free(cur);cur = ne;}ps->count = 0;ps->head = ps->tail = cur = NULL;
}void QuPush(Queue* ps, QDataType x)
{assert(ps);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->val = x;newnode->ne = NULL;if (ps->head == NULL){assert(ps->tail == NULL);ps->head = ps->tail = newnode;}else{ps->tail->ne = newnode;ps->tail = newnode;}ps->count++;
}void QuPop(Queue* ps)
{assert(ps);assert(ps->count);if (ps->head->ne == NULL){free(ps->head);ps->head = ps->tail = NULL;}else{QNode* cur = ps->head->ne;free(ps->head);ps->head = cur;}ps->count--;
}QDataType QuFront(Queue* ps)
{assert(ps);assert(ps->count);return ps->head->val;}
QDataType QuBack(Queue* ps)
{assert(ps);assert(ps->count);return ps->tail->val;
}bool QuEmpty(Queue* ps)
{assert(ps);assert(ps->count);return ps->head == NULL;
}int QuSize(Queue* ps)
{assert(ps);return ps->count;
}

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

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

相关文章

STM32学习7 按键扫描

STM32学习7 按键扫描 一、实验电路介绍二、按键GPIO初始化三、扫描原理1. GPIO引脚配置2. 状态轮询3. 按键状态检测4. 循环扫描的优缺点优点&#xff1a;缺点&#xff1a; 四、一次扫描与持续扫描五、代码实现1. 头文件定义2. 函数实现3. 主体函数 一、实验电路介绍 本实验使用…

Linux 之三:CentOS7 目录结构 和 日期及时区设置

Linux 目录 以下是对这些目录的解释&#xff1a; /bin&#xff1a;bin是Binary的缩写, 这个目录存放着最经常使用的命令。/boot&#xff1a; 这里存放的是启动Linux时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。/dev &#xff1a; dev是Device(设备)的缩写…

docker安装和使用kafka

1. 启动zookeeper Kafka依赖zookeeper, 首先安装zookeeper -p&#xff1a;设置映射端口&#xff08;默认2181&#xff09; docker run --name zookeeper \--network app-tier \-e ALLOW_ANONYMOUS_LOGINyes \--restartalways \-d bitnami/zookeeper:latest2. 启动kafka docker…

STM32各外设初始化步骤

1、GPIO初始化步骤 1、使能GPIO时钟 2、初始化GPIO的输入/输出模式 3、设置GPIO的输出值或获取GPIO的输入值 GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin…

青少年如何从零开始学习Python编程?有它就够了!

文章目录 写在前面青少年为什么要学习编程 推荐图书图书特色内容简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家带来一本非常适合青少年学习编程的图书&#xff0c;快来看看吧~ 青少年为什么要学习编程 青少年学习编程&#xff0c;就好比在他们年轻时就开始掌握一种…

线程简介

线程简介 这里先说明一下&#xff0c;进程和线程是不同的 进程&#xff1a;程序的执行过程&#xff0c;是一个独立的运行环境&#xff0c;持有资源和线程&#xff0c;相当于一个应用程序&#xff0c;操作系统在分配资源时把资源分配给进程(堆和方法区是属于进程的) 线程&#x…

【学习考试心得】在誉天学习考试RHCE9.0的体验

作为华中第一位参加RHCE9.0线上考试的考生&#xff0c;很荣幸能来写这个心得&#xff0c;和大家分享一下线上的考试的一些体验。 一、学习体验 首先在红帽课程的学习中&#xff0c;跟着杨峰老师的脚步&#xff0c;整个学习过程中都非常有意思。杨峰老师充满磁性的声音和小王老师…

【YOLO v5 v7 v8 v9小目标改进】辅助超推理SAHI:分而治之,解决高分辨率图像中小物体检测的问题

辅助超推理SAHI&#xff1a;分而治之&#xff0c;解决高分辨率图像中小物体检测的问题 设计思路结构小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 论文&#xff1a;https://arxiv.org/pdf/2202.06934.pdf 代码&#xff1a;https://github.com/obss/sahi 设计思…

C++内存泄漏检测

C进阶专栏&#xff1a;http://t.csdnimg.cn/aTncz 相关系列文章 C技术要点总结, 面试必备, 收藏起来慢慢看 C惯用法之RAII思想: 资源管理 C智能指针的自定义销毁器(销毁策略) 目录 1.内存泄漏概述 1.1.内存泄漏产生原因 1.2 内存泄漏导致的后果 1.3 内存泄漏解决思路 2.宏…

基于Springboot免费搭载轻量级阿里云OSS数据存储库(将本地文本、照片、视频、音频等上传云服务保存)

一、注册阿里云账户 打开https://www.aliyun.com/&#xff0c;申请阿里云账户并完成实名认证&#xff08;个人&#xff09;。这种情况就是完成了&#xff1a; 二、开通OSS服务 点击立即开通即可。 三、创建Bucket 申请id和secert&#xff1a; 进去创建一个Accesskey就会出现以…

小米消金:加强信息保护,防范二维码诈骗

近年来&#xff0c;扫码支付已经完全融入了中国人的日常生活。从大型百货商场到路边摊&#xff0c;二维码被广泛运用于各种支付场景。老百姓一边享受二维码支付便捷&#xff0c;另一边二维码支付骗局也“如影随形”&#xff0c;不胜其烦。为帮助广大消费者提高风险防范意识和安…

【Qt学习】QProgressBar的使用(进度条的实现)

文章目录 1. 介绍2. 实例2.1 按钮启动进度条2.2 更改进度条样式2.3 资源文件 1. 介绍 详细的 QProgressBar 内容可以通过 查阅Qt官方文档 &#xff0c;这里进行简要的总结&#xff1a; QProgressBar 是Qt框架中的一个控件&#xff0c;用于显示进度条&#xff1a; QProgressBar…

wordpress免费主题下载

免费wordpress模板下载 简洁大气的文化艺术类wordpress模板&#xff0c;可以免费下载&#xff0c;实用易上手&#xff0c;新手也适合。 https://www.wpniu.com/themes/304.html 免费wordpress主题下载 高端大气上档次的wordpress主题&#xff0c;也可以是免费的&#xff0c;…

2024年华为OD机试真题-数的分解-Java-OD统一考试(C卷)

题目描述: 给定一个正整数n,如果能够分解为m(m > 1)个连续正整数之和,请输出所有分解中,m最小的分解。 如果给定整数无法分解为连续正整数,则输出字符串"N"。 输入描述: 输入数据为一整数,范围为(1, 2^30] 输出描述: 比如输入为: 21 输出: 21=10+11 补…

修改MonkeyDev默认配置适配Xcode15

上一篇文章介绍了升级Xcode15后,适配MonkeyDev的一些操作,具体操作可以查看:Xcode 15 适配 MonkeyDev。 但是每次新建项目都要去修改那些配置,浪费时间和精力,这篇文章主要介绍如何修改MonkeyDev的默认配置,做到一次修改永久生效。 MonkeyDev的默认安装路径是在/opt/Mo…

iclone更奇怪了用自动对齐才搞得定

1前一个clip的位置 2选root的话就跑到这里了&#xff0c;跟前一个clip差很多 3换了left foot对齐之后才正常 4这时候开不开自动对齐不影响 5奇怪医生的中心似乎是途中的花坐标轴偏离人体好多呀不知何时跑这里的难道前面是应为这个&#xff1f;中心跑了我还不知道 6动画交叉的时…

【常见索引使用】⭐️Mysql中索引的类型以及使用方式和失效场景

目录 一、前言 二、数据准备 三、索引的分类 四、索引示例 示例1、主键索引&#xff08;Primary Key Index&#xff09;与 唯一索引&#xff08;Unique Index&#xff09; 示例2、前缀索引&#xff08;Prefix Index&#xff09; 示例3、联合索引&#xff08;复合索引&am…

GWO-RF|灰狼算法优化随机森林 分类预测|多变量分类预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 灰狼优化算法&#xff1a; 随机森林&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; …

如何规划应用商店优化策略

应用商店是拥挤的地方。拥有超过 600 万个应用程序&#xff0c;制定应用程序商店优化 (ASO) 策略比以往任何时候都更加重要。ASO 有助于确保您的应用在搜索结果中排名更高&#xff0c;以便潜在用户可以轻松找到它。通过针对App Store和 Google Play优化App&#xff0c;能够吸引…

使用ES检索PDF或Word等格式文件方案

#大数据/ES #经验 #方案架构 ES检索PDF/Word等格式文件方案 插件安装 ES有文档预处理插件&#xff0c;但是7.x版本默认发版包不包含这个ingest attachment plugin 。 通过摄取附件插件&#xff0c;Elasticsearch 可以使用 Apache 文本提取库 Tika 提取常见格式的文件附件&a…