【数据结构】实现队列

大家好,我是苏貝,本篇博客带大家了解队列,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • 一. 队列的概念及结构
  • 二. 队列的实现
    • 队列的结构体
    • 初始化
    • 销毁
    • 队尾插入
    • 队头删除
    • 显示第一个节点的值
    • 显示最后一个节点的值
    • 是否为空
    • 队列的大小
  • 三. 模块化代码实现
    • Queue.h
    • Queue.c
    • Test.c
    • 结果演示

一. 队列的概念及结构

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

在这里插入图片描述


二. 队列的实现

1

队列的结构体

因为数组在头删的时候不方便,所以我们采用单链表来实现。

typedef int QDataType;typedef struct QueneNode
{QDataType val;struct QueneNode* next;
}QNode;typedef struct Quene
{QNode* phead;//指向第一个节点QNode* ptail;//指向最后一个节点int size;
}Quene;

2

初始化

因为我们要对队列进行初始化,所以实参要传Queue类型变量的地址,用一级指针来接收。因为实参(Queue类型变量的地址)不可能为NULL,所以对它断言(下面的接口同理)。

void QueneInit(Quene* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}

3

销毁

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

4

队尾插入

插入前要创建一个新节点,插入时还要判断队列是否为空,若为空则让pq->phead = pq->ptail = newnode。若不为空则只让pq->ptail ->next= newnode,再pq->ptail=pq->ptail->next
注意不要忘记pq->size++

void QuenePush(Quene* pq, QDataType x)
{assert(pq);//创建一个新节点QNode* newnode = (Quene*)malloc(sizeof(Quene));if (newnode == NULL){perror("malloc fail");return;}newnode->next = NULL;newnode->val = x;//插入if (pq->ptail == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = pq->ptail->next;}pq->size++;
}

5

队头删除

删除时要保证队列里有元素,所以对pq->phead断言,下面的显示第一个/最后一个节点的值同理
注意:当队列里只有一个元素时,删除后pq->phead指向NULL没错,但是此时pq->ptail是野指针,所以也要将pq->ptail置为NULL。不要忘记pq->size- -

void QuenePop(Quene* pq)
{assert(pq);assert(pq->phead);QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;if (pq->phead == NULL){pq->ptail = NULL;}pq->size--;
}

6

显示第一个节点的值

QDataType QueneFront(Quene* pq)
{assert(pq);return pq->phead->val;
}

7

显示最后一个节点的值

QDataType QueneBack(Quene* pq)
{assert(pq);return pq->ptail->val;
}

8

是否为空

bool QueneEmpty(Quene* pq)
{assert(pq);return pq->phead == NULL;
}

9

队列的大小

int QueneSize(Quene* pq)
{assert(pq);return pq->size;
}

三. 模块化代码实现

Queue.h

#include<stdio.h>
#include<assert.h>
#include<stdbool.h>typedef int QDataType;typedef struct QueneNode
{QDataType val;struct QueneNode* next;
}QNode;typedef struct Quene
{QNode* phead;QNode* ptail;int size;
}Quene;//初始化
void QueneInit(Quene* pq);
//销毁
void QueneDestroy(Quene* pq);
//队尾插入
void QuenePush(Quene* pq, QDataType x);
//队头删除
void QuenePop(Quene* pq);
//显示第一个节点的值
QDataType QueneFront(Quene* pq);
//显示最后一个节点的值
QDataType QueneBack(Quene* pq);
//是否为空
bool QueneEmpty(Quene* pq);
//队列大小
int QueneSize(Quene* pq);

Queue.c

#include"Quene.h"//初始化
void QueneInit(Quene* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}//销毁
void QueneDestroy(Quene* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}//队尾插入
void QuenePush(Quene* pq, QDataType x)
{assert(pq);//创建一个新节点QNode* newnode = (Quene*)malloc(sizeof(Quene));if (newnode == NULL){perror("malloc fail");return;}newnode->next = NULL;newnode->val = x;//插入if (pq->ptail == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = pq->ptail->next;}pq->size++;
}//队头删除
void QuenePop(Quene* pq)
{assert(pq);assert(pq->phead);QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;if (pq->phead == NULL){pq->ptail = NULL;}pq->size--;
}//显示第一个节点的值
QDataType QueneFront(Quene* pq)
{assert(pq);return pq->phead->val;
}//显示最后一个节点的值
QDataType QueneBack(Quene* pq)
{assert(pq);return pq->ptail->val;
}//是否为空
bool QueneEmpty(Quene* pq)
{assert(pq);return pq->phead == NULL;
}//队列大小
int QueneSize(Quene* pq)
{assert(pq);return pq->size;
}

Test.c

#include"Quene.h"int main()
{Quene p;QueneInit(&p);QuenePush(&p, 1);QuenePush(&p, 2);QuenePush(&p, 3);QuenePush(&p, 4);QuenePush(&p, 5);while (!QueneEmpty(&p)){printf("%d  ", QueneFront(&p));QuenePop(&p);}QueneDestroy(&p);return 0;
}

结果演示

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

【Java程序员面试专栏 算法思维】六 高频面试算法题:动态规划

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊回溯算法,主要就是排列组合问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间零钱兑换动态规划+双重循环dp[i]表示兑换金额为i元的最少…

iOS消息转发流程

当向Objc对象发送消息时&#xff0c;如果找到对象对应的方法&#xff0c;就会进入消息转发流程&#xff0c;给开发者提供一些最后的机会处理消息无法发送问题&#xff0c;以免出现程序崩溃。 1. 回调对象的resolveInstanceMethod方法&#xff0c;在这个方法中&#xff0c;允许开…

阿里云定价_ECS产品价格_云服务器收费标准 - 阿里云官方活动

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

基于 LLaMA 和 LangChain 实践本地 AI 知识库

有时候,我难免不由地感慨,真实的人类世界,本就是一个巨大的娱乐圈,即使是在英雄辈出的 IT 行业。数日前,Google 正式对外发布了 Gemini 1.5 Pro,一个建立在 Transformer 和 MoE 架构上的多模态模型。可惜,这个被 Google 寄予厚望的产品并未激起多少水花,因为就在同一天…

S2---FPGA-A7板级原理图硬件实战

视频链接 FPGA-A7板级系统硬件实战01_哔哩哔哩_bilibili FPGA-A7板级原理图硬件实战 基于XC7A100TFGG484的FPGA硬件设计流程图 A7核心板&#xff0c;是基于XILINX公司的ARTIX-7系列100T的XC7A100T,2FGG484I这款芯片开发的高性能核心板&#xff0c;具有高速&#xff0c;高带宽&a…

Android 签名机制

V1是内部文件单个签 但是增加apk文件目录下面随意增加文件并不会有影响,它只关心meta-info文件 mf汇总清单的各个文件sha256 V2 整个APK文件,按文件进行hash 那么便不能随便在这里面增加文件了,增加了签名分块&#xff08;不然签名信息存哪里&#xff09;这里涉及一个文件概念 …

如何修炼成“神医”——《OceanBase诊断系列》之一

本系列是基于OcenaBase 开发工程师在工作中的一些诊断经验&#xff0c;也欢迎大家分享相关经验。 1. 关于神医的故事 扁鹊&#xff0c;中国古代第一个被正史记载的医生&#xff0c;他的成才之路非常传奇。年轻时&#xff0c;扁鹊是一家客栈的主管。有一位名叫长桑君的客人来到…

性能优化篇(二) 静态合批步骤与所有注意事项\游戏运行时使用代码启动静态合批

静态合批步骤: 1.开启Project Settings —>Player–>Other Setting里勾选Static Batching选项(一般情况下unity都是默认勾选状态) 2.勾选需要合批的静态物体上的Batching Static项,勾选后此物体下的所有子物体都默认参与静态合批(勾选后物体不能进行移动/旋转/缩放操作,…

02-设计概述

上一篇&#xff1a;01-导言 本章重点讨论 JNI 中的主要设计问题。本节中的大多数设计问题都与本地方法有关。调用 API 的设计将在第 5 章&#xff1a;调用 API 中介绍。 2.1 JNI 接口函数和指针 本地代码通过调用 JNI 函数来访问 Java 虚拟机功能。JNI 函数可通过接口指针使用…

LeetCode383. 赎金信(C++)

LeetCode383. 赎金信 题目链接代码 题目链接 https://leetcode.cn/problems/ransom-note/description/ 代码 class Solution { public:bool canConstruct(string ransomNote, string magazine) {int record[26] {0};if(ransomNote.size() > magazine.size()) return fa…

多层感知器(神经网络)与激活函数

单个神经元&#xff08;二分类&#xff09; 多个神经元&#xff08;多分类&#xff09; 多层感知器 多层感知器&#xff0c;他是一种深度学习模型&#xff0c;通过多层神经元的连接和激活来解决非线性问题。 激活函数 激活函数的种类包括relu&#xff0c;sigmoid和tanh等 …

批量检测微信小程序是否封禁接口源码

<?php // 要检测的 appid 列表 $appids array(appid1, appid2, appid3); // 使用实际的 appid // 循环调用接口检测小程序状态 foreach ($appids as $appid) { $url https://yan.changxunwangluo.cn/xcx/check_mini_program.php?appid . urlencode($appid); $…

敏捷开发模型:一种灵活、协作和持续的软件开发方法

敏捷开发模型&#xff1a;一种灵活、协作和持续的软件开发方法 引言 在软件开发领域&#xff0c;随着市场需求的不断变化和技术的迅速发展&#xff0c;传统的瀑布模型逐渐暴露出其局限性。为了应对这些挑战&#xff0c;敏捷开发模型应运而生。敏捷开发模型强调灵活、协作和持…

【ArcPy】简化ArcGISPro默认Python环境体量

参考文献 安装 ArcPy—ArcGIS Pro | 文档

[数据集][目标检测]鸡蛋破蛋数据集VOC+YOLO格式792张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;792 标注数量(xml文件个数)&#xff1a;792 标注数量(txt文件个数)&#xff1a;792 标注类别…

同源不同页面之间的通信,SharedWorker使用

同源不同页面之间的通信&#xff0c;SharedWorker使用 描述实现结果 描述 同源不同页面之间的通信&#xff0c;使用SharedWorker&#xff0c;或者使用全局方法通信&#xff0c;这里使用SharedWorker来实现 mdn地址&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/A…

Odoo迈入开源第一低代码开发平台的重要里程碑

Odoo17的正式发布已经过去好几个月了&#xff0c;通过一段时间的运用&#xff0c;最大的感触就是&#xff0c;Odoo会成为企业管理软件低代码开发平台的重要一员&#xff0c;而V17则会成为这个过程中具有里程碑意义的版本。 时隔四个月&#xff0c;让我们回头来看看Odoo17带来的…

基YOLOV5实现的AI智能盒子

基于yolov5实现的AI智能盒子框架 开发背景技术实现产品效果源码预览功能介绍 2021-2023是沉淀的几年&#xff0c;经济不景气&#xff0c;各行各业都不太好混&#xff0c;所以这几年也没有太多心思花在csdn上为各大网友写一些技术文章&#xff0c;2024年初&#xff0c;也算是给自…

光栅化算法

多数计算机图形图像&#xff0c;是通过光栅显像显示给用户的&#xff0c;这种系统将图像作为像素阵列进行显示&#xff0c;像素&#xff08;pixel&#xff09;即图像元素&#xff08;picture element&#xff09;的简称。这些像素采用RGB颜色空间。本文讨论光栅显像的基本原理&…

蓝牙耳机哪个好用性价比高?2024热销蓝牙耳机大测评!选购不焦虑

​近年来&#xff0c;蓝牙耳机已经成为了一个非常热门的选择&#xff0c;不仅因为它们小巧便捷&#xff0c;还因为它们的防水性能、音质和佩戴体验已经逐渐超越了有线耳机。随着越来越多的品牌加入蓝牙耳机的市场竞争&#xff0c;各种类型的蓝牙耳机层出不穷。特别是对于运动爱…