「数据结构」队列

目录

队列的基本概念

队列的实现

头文件queue.h

实现函数接口

1.初始化和销毁

2.出队列和入队列

3.获取队头元素和队尾元素

4.队列长度+判空

后记


前言

欢迎大家来到小鸥的博客~

个人主页:海盗猫鸥

本篇专题:数据结构

多谢大家的支持啦!

上一篇关于数据结构的博客中我们讲解了栈,本篇我们就来讲讲队列吧!

队列的基本概念

  1. 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)
  2. 入队列:进行插入操作的一端称为队尾
  3. 出队列:进行删除操作的一端称为队头

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

如果使用数组,每次出队列之后,都需要移动数据,消耗较大。

所以本篇使用单链表实现队列,因为头删和尾插刚好可以满足队列的需要,单链表消耗最大的就是尾删后遍历查找新尾节点,但队列不需要尾删,所以不存在这个问题。

队列的入队列顺序和出队列顺序一定是相同的。

队列的实现

队列的C语言实现,我们要实现的函数和实现栈是差不多的:
只是其存放数据的数据结构变为了一个链表

头文件queue.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int QueueDataType;typedef struct QueueNode
{QueueDataType data;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//初始化和销毁
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);//入队列和出队列
void QueuePush(Queue* pq, QueueDataType x);
void QueuePop(Queue* pq);//队头元素和队尾元素
QueueDataType QueueFront(Queue* pq);
QueueDataType QueueBack(Queue* pq);//队列长度函数
int QueueSize(Queue* pq);
//判空
bool QueueEmpty(Queue* pq);

这里我们除了定义了链表节点的结构体QueueNode之外,我们还额外创建了一个Queue的结构体,这个结构体是用来存放队列的一些信息的,phead指向队头,ptail则指向队尾,这样进行入栈和出栈的操作时,就可以直接通过这俩个指针直接对链表进行头删和尾插操作,从而实现出队列和入队列操作,;size则表示队列的数据个数。

实现函数接口

1.初始化和销毁

因为我们是通过Queue结构体来操作队列的,所以不论初始化还是后面的函数都需要的是Queue*类型的指针;

//初始化和销毁
void QueueInit(Queue* pq)
{assert(pq);pq->size = 0;pq->phead = pq->ptail = NULL;
}
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;
}

由于是本质是一个链表结构,所以在释放空间时,需要遍历链表进行释放。

2.出队列和入队列

队列入数据只能从队尾插入;出数据只能从队头出。

//入队列(尾插)
void QueuePush(Queue* pq, QueueDataType x)
{assert(pq);//动态申请空间创建空间QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail!");return;}newnode->data = x;newnode->next = NULL;//没有节点时if (pq->ptail == NULL){pq->phead = pq->ptail = newnode;}else//存在节点{pq->ptail->next = newnode;pq->ptail = newnode;}//队列长度pq->size++;
}
//出队列(头删)
void QueuePop(Queue* pq)
{assert(pq);assert(pq->phead != NULL);//只有一个节点if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else//多个节点{QNode* newhead = pq->phead->next;free(pq->phead);pq->phead = newhead;}pq->size--;
}

入队列和出队列就是运用的链表的尾插和头删的逻辑。

3.获取队头元素和队尾元素

//队头元素和队尾元素
QueueDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead != NULL);return pq->phead->data;
}
QueueDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail != NULL);return pq->ptail->data;
}

由于我们的Queue结构体中就存储了队头和队尾的地址,所以这两个函数就可以直接返回对应的数据。

4.队列长度+判空

//队列长度函数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
//判空
bool QueueEmpty(Queue* pq)
{assert(pq);return !(pq->size);
}

Queue结构体中的size就是在这里起作用的,如果没有size这个成员,就需要遍历链表来实现。

后记

本篇队列的介绍和C语言实现就结束啦!

下篇我们将讲解几道栈和队列的相关OJ题,大家不见不散哦!

那么我们下次见~

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

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

相关文章

Java入门基础学习笔记36——面向对象基础

面向对象编程快速入门&#xff1a; 计算机是用来处理数据的。 单个变量 数组变量 对象数据 Student类&#xff1a; package cn.ensource.object;public class Student {String name;double chinese_score;double math_score;public void printTotalScore() {System.out.pr…

达梦数据库使用dmlcvt命令找回更改前的数据

在生产系统上不小心修改了表数据后最快的方法是用闪回查询找回。但时间不能超过undo_retention&#xff08;默认90秒&#xff09;。其实最标准的处理方法是在其他机器上将数据库恢复到修改前的时刻。但数据库比较大时恢复时间较长。真实场景可能比较急。那么也可以分析归档日志…

数组序号Spinner

使用Spnner代替编辑框&#xff0c;只能选择已有的&#xff0c;不会越界&#xff0c;大大简化了代码。 String[] SA new String[list.size()]; for (int i0; i<SA.length; i) {SA[i] String.valueOf(i); } ArrayAdapter<String> adapter1 new ArrayAdapter<>(…

[国产大模型简单使用介绍] 开源与免费API

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 随着大模型技术蓬勃发展和开源社区越来越活跃,国内的大模型也如雨后春笋一般.这时,一些就会问了,有了llama3,Mistral还有Gemma等等,国外大厂接连发力,一些开源社区也会有一些不错的模型,国内怎么比?对一个人使用,oll…

下雨!大水蚁引发的水文!看比赛咯,曼联VS曼城——早读(逆天打工人爬取热门微信文章解读)

唠唠嗑 水一水 引言Python 代码结尾 引言 今天星期六 大小周 一个等了很久的双休 昨天晚上真的是吓到我了 漫天的小飞虫 我一开始还以为是一两只 没想到那些小飞虫 从阳台不断飞进来 在山卡拉下面租房子 也是太恐怖了 来个特写 他们也就一个晚上的时间 成虫 天气合适 长翅…

网络拓扑—DNS服务搭建

文章目录 DNS服务搭建网络拓扑配置网络DNSPC 安装DNS服务配置DNS服务创建正向查找区域创建反向查找区域创建子域名 PC机DNS域名解析 DNS服务搭建 网络拓扑 为了节省我的U盘空间&#xff0c;没有用路由器&#xff0c;所以搭建的环境只要在同网段即可。 //交换机不用考虑 DNS&a…

MiniCPM-Llama3-V-2_5-int4

MiniCPM-Llama3-V-2_5-int4大模型部署使用环境&#xff1a; python3.8cuda11.8其它要求&#xff0c;按照安装文档要求下载即可 我是在算力平台用4090跑的&#xff0c; GPU 显存&#xff08;8GB&#xff09;可以部署推理 int4 量化版本&#xff0c;如果推理非量化版本需要更高显…

云部署最简单python web

最近在玩云主机&#xff0c;考虑将简单的web应用装上去&#xff0c;通过广域网访问一下&#xff0c;代码很简单&#xff0c;所以新手几乎不会碰到什么问题。 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, World!app.route(/gree…

2024洗地机哪个牌子好?洗地机十大品牌

洗地机在不同家庭环境中都能发挥其独特的优势&#xff0c;无论是大面积的地板还是狭小的角落&#xff0c;都能轻松应对。 对于有孩子或宠物的家庭&#xff0c;地面上经常会有各种杂物和污渍&#xff0c;洗地机强大的吸力和深度清洁功能&#xff0c;可以迅速清理掉这些脏东西&a…

数理逻辑:1、预备知识

17.1 命题和联结词 ​ 命题&#xff1a;可以判定真假的陈述句。&#xff08;则悖论&#xff0c;祈使句&#xff0c;疑问句都不是命题&#xff09; ​ 原子命题&#xff1a;不能被分割为更小的命题的命题 例如&#xff1a; 2既是素数又是偶数 可以由$p: 2 是素数&#xff0c;…

DNS的服务与部署(2)

1、dns的安装及开启 dnf install bind.x86_64 -y #安装 #Berkeley Internet Name Domain (BIND) systemctl enable --now named #启用dns服务&#xff0c;服务名称叫named firewall-cmd --permanent --add-servicedns #火墙设置 firewall-cmd --reload …

基于SSH的母婴用品销售管理系统带万字文档

文章目录 母婴商城系统一、项目演示二、项目介绍三、系统部分功能截图四、万字论文参考五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 母婴商城系统 一、项目演示 母婴商城系统 二、项目介绍 基于SSH的母婴商城系统 系统…

Tina-Linux -- 3. LVGL测试

参考韦东山 – Tina_Linux_图形系统_开发指南 Tina-linux lvgl 配置 环境配置 进入Tina-SDK根目录 source build/envsetup.sh lunch XXX平台名称 make menuconfigLVGL Gui --->Littlevgl --->< > lv_demo<*> lv_examples &#xff08;lvgl官方demo&#…

【区块链】fisco节点运维 更新ing

基于已完成的区块链系统与管理平台搭建工作&#xff0c;开展区块链节点的加入与退出运维工作&#xff0c;具体内容如下 以下只是举例子讲 如果有其他修改没举例出来可以留言 私信 主要以比赛出题的形式讲 区块链节点输出等级为警告级&#xff0c;并设置日志存储阈值为100MB并…

Capture One Studio for Mac:打造完美影像的利器

对于摄影师而言&#xff0c;每一次按下快门都是一次对完美影像的追求。而Capture One Studio for Mac正是这样一款能够帮助你实现这一追求的利器。 Capture One Studio for Mac v16.4.2.1中文直装版下载 首先&#xff0c;Capture One Studio for Mac拥有出色的图像处理能力。它…

从零起航,Python编程全攻略

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、Python入门之旅 二、Python进阶之道 三、Python爬虫实战 四、Python数据分析利器 五…

kind: Telemetry

访问日志 访问日志提供了一种从单个工作负载实例的角度监控和理解行为的方法。 Istio 能够以一组可配置的格式为服务流量生成访问日志&#xff0c; 使操作员可以完全控制日志记录的方式、内容、时间和地点。 有关更多信息&#xff0c;请参阅获取 Envoy 的访问日志。 https:/…

模块化程序设计(函数的定义、调用、参数传递、局部变量、全局变量)

函数的引入&#xff1a; 我们曾经学习了程序设计中的三种基本控制结构&#xff08;顺序、分支、循环&#xff09;。用它们可以组成任何程序。但在应用中&#xff0c;还经常用到子程序结构。 通常&#xff0c;在程序设计中&#xff0c;我们会发现一些程序段在程序的不同地方反复…

RabbitMQ 发布订阅

RabbitMQ 发布订阅视频学习地址&#xff1a; 简单模式下RabbitMQ 发布者发布消息 消费者消费消息 Publist/Subscribe 发布订阅 在 RabbitMQ 中&#xff0c;发布订阅模式是一种消息传递方式&#xff0c;其中发送者&#xff08;发布者&#xff09;不会将消息直接发送到特 定的…

基于open3d对kitti数据集检测结果可视化

前言 KITTI数据集是自动驾驶和计算机视觉领域中一个广泛使用的基准数据集&#xff0c;它提供了丰富的传感器数据&#xff0c;包括激光雷达、相机和GPS等。Open3D是一个功能强大的3D数据处理和可视化库&#xff0c;支持多种3D数据格式。本文将介绍如何使用Open3D对KITTI数据集的…