【数据结构】实现队列

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


目录

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

一. 队列的概念及结构

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

在这里插入图片描述


二. 队列的实现

1

队列的结构体

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

typedef int QDataType;typedef struct QueueNode
{struct Queue* next;QDataType val;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;

2

初始化

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

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

3

销毁

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

4

队尾插入

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

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

5

队头删除

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

void QueuePop(Queue* pq)
{assert(pq);assert(pq->phead);Queue* next = pq->phead->next;free(pq->phead);pq->phead = next;if (pq->phead == NULL){pq->ptail = NULL;}pq->size--;
}

6

显示第一个节点的值

QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}

7

显示最后一个节点的值

QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->phead);return pq->ptail->val;
}

8

是否为空

bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}

9

队列的大小

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

三. 模块化代码实现

Queue.h

#include<stdio.h>
#include<assert.h>
#include<stdbool.h>typedef int QDataType;typedef struct QueueNode
{struct Queue* next;QDataType val;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//初始化
void QueueInit(Queue* pq);
//销毁
void QueueDestroy(Queue* pq);
//队尾插入
void QueuePush(Queue* pq, QDataType x);
//队头删除
void QueuePop(Queue* pq);
//显示第一个节点的值
QDataType QueueFront(Queue* pq);
//显示最后一个节点的值
QDataType QueueBack(Queue* pq);
//是否为空
bool QueueEmpty(Queue* pq);
//队列的大小
int QueueSize(Queue* pq);

Queue.c

#include"Queue.h"//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}//销毁
void QueueDestroy(Queue* pq)
{assert(pq);while (pq->phead){QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->ptail = NULL;pq->size = 0;
}//队尾插入
void QueuePush(Queue* pq, QDataType x)
{assert(pq);//创建一个新节点QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;//插入if (pq->phead == NULL){pq->ptail = pq->phead = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}//队头删除
void QueuePop(Queue* pq)
{assert(pq);assert(pq->phead);Queue* next = pq->phead->next;free(pq->phead);pq->phead = next;if (pq->phead == NULL){pq->ptail = NULL;}pq->size--;
}//显示第一个节点的值
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}//显示最后一个节点的值
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->phead);return pq->ptail->val;
}//是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}//队列的大小
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

Test.c

#include"Queue.h"int main()
{Queue p;QueueInit(&p);QueuePush(&p, 1);QueuePush(&p, 2);QueuePush(&p, 3);QueuePush(&p, 4);QueuePush(&p, 5);while (!QueueEmpty(&p)){printf("%d ", QueueFront(&p));QueuePop(&p);}QueueDestroy(&p);return 0;
}

结果演示

在这里插入图片描述


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

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

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

相关文章

【双指针】移动零

移动零 链接 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/move-zeroes/submissions/506832592/ 题目 题解 异地变…

RFID(Radio Frequency Identification)技术笔记

一、RFID的介绍 RFID&#xff0c;全称为Radio Frequency Identification&#xff0c;即射频识别技术&#xff0c;也常被称为电子标签或无线射频识别。它是一种非接触式的自动识别技术&#xff0c;通过射频信号自动识别目标对象并获取相关数据&#xff0c;识别过程无需人工干预&…

Redis、Elasticsearch(ES)、RocketMQ和MYSql 持久化对比

在现代大数据和分布式系统中&#xff0c;数据持久化是一个至关重要的话题。本文将针对 Redis、Elasticsearch&#xff08;ES&#xff09;、 RocketMQ和MYSql 这四种常见的数据存储和消息队列系统进行持久化方面的对比分析&#xff0c;帮助读者更好地了解它们各自的特点和适用场…

【Mybatis】多表映射 第二期

文章目录 一、多表映射概念二、对一映射三、对多映射四、多表映射总结4.1 多表映射优化4.2 多表映射总结 一、多表映射概念 多表关系&#xff1a; 一对一一对多 | 多对一多对多 一个 客户 对应 多个订单一个订单 对应 一个客户 举例&#xff1a; 对一 实体类设计&#xff1a…

自学高效备考2024年AMC10:2000-2023年1250道AMC10真题解析

如何通过自学提高初中和高中数学成绩&#xff1f;现在初中和高中有哪些可以参加的数学竞赛&#xff1f;有没有难度适中、兼具趣味性的数学竞赛&#xff1f;现在参与人数较多的初中、高中数学有哪些&#xff1f;... 如果你也在关注以上问题&#xff0c;不妨看看AMC10美国数学竞…

【书生·浦语大模型实战营】第 2 节 -课后作业

第二节 -轻松玩转书生浦语大模型趣味 Demo-课后作业 0.课程体验0.1 鸡兔同笼0.2 逻辑推理0.3 AI会毁灭人类吗&#xff1f; 1.课后作业1.1 基础作业1.1.1 作业11.1.2 作业2 0.课程体验 课程链接&#xff1a;https://github.com/internLM/tutorial 首先&#xff0c;这个课程是免费…

C语言do...while 语句的基本格式是什么?

一、问题 C语⾔中有三种循环语句&#xff0c;do...while 语句是其中的⼀个&#xff0c;它的基本格式是怎样的呢&#xff1f; 二、解答 do...while 语句的⼀般形式为&#xff1a; do语句;while(表达式); 其中语句是循环体&#xff0c;表达式是循环条件。 do...while 语句是这…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的口罩识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发口罩识别系统对于提升公共卫生安全和疫情防控具有重要意义。本篇博客详细介绍了如何利用深度学习构建一个口罩识别系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5的对比&#xff0c;给出…

攻略 | 如何通过数据解析,优化知识库以满足用户需求

在日常生活和工作中&#xff0c;一个高效且实用的知识库已成为我们的得力助手。但如何确保它不仅仅是信息的堆砌&#xff0c;真正为用户创造价值与效益&#xff1f;接下来&#xff0c;我们将深入探讨这一问题&#xff0c;并借助HelpLook知识库的数据分析功能&#xff0c;带您全…

修改一个教材上的网站源码使它能在www服务器子目录上正常运行

修改一个教材上的网站源码&#xff0c;使它能在www服务器子目录上正常运行。 该网站源码是教材《PHPMySQL网站开发项目式教程》上带的网站源码。该源码是用 php html 写的。该源码包含对mysql数据库进行操作的php代码。以前该网站源码只能在www服务器的根目录上正常运行&…

计算机设计大赛 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

代码随想录 二叉树第三周

目录 404.左叶子之和 513.找树左下角的值 112.路径总和 106.从中序与后序遍历构造二叉树 105.从前序与中序遍历序列构造二叉树 654.最大二叉树 404.左叶子之和 404. 左叶子之和 简单 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输…