文章目录

  • (1)前言
    • 1)队列的概念
    • 2)队列的结构
  • (2)队列的实现(链式结构)
    • 1)队列的定义
    • 2)队列的初始化
    • 3)队列的销毁
    • 4)入队(尾插)
    • 5)出队(头删)
    • 6)获取队列元素个数
    • 7)获取队头元素
    • 8)获取队尾元素
    • 9)检查队列是否为空
  • (3)测试队列的功能

数据结构系列文章:

【数据结构入门】顺序表(SeqList)详解(初始化、增、删、查、改)

【数据结构入门】无头单向非循环链表(SList)详解(定义、增、删、查、改) | 图解链表,超生动详细哦~

【数据结构入门】带头双向循环链表(List)详解(定义、增、删、查、改) | 配有大量图解,超详细哦~

【数据结构入门】顺序表和链表的区别,以及啥是缓存利用率

【数据结构入门】栈(Stack)的实现(定义、销毁、入栈、出栈等) | 图解数据结构,超详细哦~

(1)前言

1)队列的概念

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

入队列:进行插入操作的一端称为队尾 。

出队列:进行删除操作的一端称为队头。

入队出队形式:一种入队顺序,只有一种出队顺序。

队列的应用:比如生活中排队买东西,先排队的先购买,平时我们用微信聊天,用键盘进行各种数字的输入,到聊天框中输出,也是队列的应用。

2)队列的结构

  • 队列的顺序结构

入队,不需要移动任何元素,时间复杂度为O(1)

出队,所有元素需要往前移动,时间复杂度为O(N)

  • 队列的链式结构

首先我们定义两个指针,队头指针指向第一个节点,队尾指针指向尾节点

入队(尾插),时间复杂度为O(1)

出队(头删),时间复杂度为O(1)


(2)队列的实现(链式结构)

首先新建一个工程( 博主使用的是 VS2019 )

  • Queue.h(队列的类型定义、接口函数声明、引用的头文件)
  • Queue.c(队列接口函数的实现)
  • Test.c(主函数、测试队列各个接口功能)

Queue.h 头文件代码如下:

#pragma once
#include<stdio.h>   /*printf*/
#include<stdbool.h> /*bool*/
#include<assert.h>  /*assert*/
#include<stdlib.h>  /*malloc*/typedef int QDataType;
typedef struct QueueNode  //队列节点结构
{QDataType data;          //节点数据struct QueueNode* next;  //节点指针
}QueueNode;/*
我们实现无头链表的头插头删接口时,因为需要改变头指针的指向
有以下这样方法:
1、传二级指针
2、改变返回值,返回新的头
3、给链表增加一个哨兵位的头节点
4、结构体包起来
*/typedef struct QueuePtr  //队列的链式结构
{QueueNode* phead;  //队头指针QueueNode* ptail;  //队尾指针
}LinkQueue;//初始化队列
void QueueInit(LinkQueue* pQ);
//销毁队列
void QueueDestroy(LinkQueue* pQ);
//入队(尾插)
void QueuePush(LinkQueue* pQ, QDataType x);
//出队(头删)
void QueuePop(LinkQueue* pQ);
//获取队列元素个数
int QueueSize(LinkQueue* pQ);
//获取队头元素
QDataType QueueFront(LinkQueue* pQ);
//获取队尾元素
QDataType QueueBack(LinkQueue* pQ);
//检查队列是否为空
bool QueueEmpty(LinkQueue* pQ);

这里重点讲解 Queue.c 中各个接口函数的实现

1)队列的定义

typedef int QDataType;typedef struct QueueNode  //队列节点结构
{QDataType data;          //节点数据struct QueueNode* next;  //节点指针
}QueueNode;typedef struct QueuePtr  //队列的链式结构
{QueueNode* phead;  //队头指针QueueNode* ptail;  //队尾指针
}LinkQueue;

2)队列的初始化

//初始化队列
void QueueInit(LinkQueue* pQ)
{assert(pQ);//队列为空pQ->phead = pQ->ptail = NULL;
}

3)队列的销毁

//销毁队列
void QueueDestroy(LinkQueue* pQ)
{assert(pQ);QueueNode* cur = pQ->phead;while (cur)  //遍历链式队列{QueueNode* next = cur->next;free(cur);cur = next;}cur = NULL;pQ->phead = pQ->ptail = NULL;  //队列为空
}

4)入队(尾插)

要分为两种情况讨论,队列为空和队列不为空

//入队(尾插)
void QueuePush(LinkQueue* pQ, QDataType x)
{assert(pQ);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));  //动态申请一个节点if (newnode == NULL)  //检查是否申请成功{perror("malloc");exit(-1);}newnode->data = x;newnode->next = NULL;  //尾节点next指针置空if (pQ->phead == NULL)  //队列为空{pQ->phead = newnode;}else  //队列不为空{pQ->ptail->next = newnode;}pQ->ptail = newnode;   //更新队尾指针
}
  • 测试其用例


5)出队(头删)

队列不能为空哦,记得在最开头检查一下

//出队(头删)
void QueuePop(LinkQueue* pQ)
{assert(pQ);assert(!QueueEmpty(pQ));  //队列不能为空if (pQ->phead == pQ->ptail)  //队列中只有一个节点{free(pQ->phead);pQ->phead = pQ->ptail = NULL;}else{QueueNode* next = pQ->phead->next;  //记录头节点的直接后继free(pQ->phead);  //释放头节点pQ->phead = next; //更新队头指针}
}

6)获取队列元素个数

//获取队列元素个数
//如果会频繁调用这个接口函数,可以在QueuePtr中加一个size记录数据个数
int QueueSize(LinkQueue* pQ)
{assert(pQ);int size = 0;QueueNode* cur = pQ->phead;while (cur)  //遍历链表{size++;cur = cur->next;}return size;
}

7)获取队头元素

队列为空是获取不了元素的哦,记得检查一下

//获取队头元素
QDataType QueueFront(LinkQueue* pQ)
{assert(pQ);assert(!QueueEmpty(pQ));  //队列不能为空return pQ->phead->data;
}

8)获取队尾元素

队列为空是获取不了元素的哦,记得检查一下

//获取队尾元素
QDataType QueueBack(LinkQueue* pQ)
{assert(pQ);assert(!QueueEmpty(pQ));  //队列不能为空return pQ->ptail->data;
}

9)检查队列是否为空

//检查队列是否为空,若为空返回true,否则返回false
bool QueueEmpty(LinkQueue* pQ)
{assert(pQ);return pQ->phead == NULL && pQ->ptail == NULL;
}

(3)测试队列的功能

void TestQueue()
{LinkQueue Q;QueueInit(&Q);QueuePush(&Q, 1);QueuePush(&Q, 2);QueuePush(&Q, 3);QueuePush(&Q, 4);//打印队列while (!QueueEmpty(&Q)){printf("%d ", QueueFront(&Q));  //获取队头元素QueuePop(&Q);  //出队}printf("\n");
}
  • 运行结果


大家快去动手实现一下吧!

【数据结构入门】队列(Queue)详解(定义、销毁、入队、出队等)| 图解数据结构,超详细哦~相关推荐

  1. 栈(Stack)和队列(Queue)详解

    1. 什么是栈,栈存储结构详解 同顺序表和链表一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如图 1 所示. 图 1 栈存储结构示意图 从图 1 我们看到,栈存储 ...

  2. Python队列Queue详解,超详细

    Queue queue模块简介 queue.Queue(maxsize=0) queue.LifoQueue(maxsize=0) queue.PriorityQueue(maxsize=0) que ...

  3. 山西2019数据结构专升本_山西省2017年专升本选拔考试(C程序设计数据结构)历年真题详解...

    山西省2017年专升本选拔考试(C程序设计数据结构)历年真题详解 说明:本试题分C程序设计和数据结构(C语言版)两部分,各占100分,满分200分,考试时间150分钟. 第一部分C程序设计 一.单项选 ...

  4. 山西2019数据结构专升本_山西省2018年专升本选拔考试(C程序设计数据结构)历年真题详解...

    1 山西省 2018 年专升本选拔考试( C 程序设计数据结构)历年真题详 解 说明 : 本试题分 C 程序设计和数据结构 (C 语言版 ) 两部分, 各占 100 分, 满分 200 分,考试时间 ...

  5. c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列图文详解

    前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法-栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去).而队列就好比是一个隧道,后面 ...

  6. Redis从入门到精通之底层数据结构快表QuickList详解

    文章目录 0.前言 1. 快表的结构 2. Redis 6.0 快表quicklist 基本结构 2.1 成员变量 2.1 主要操作 2.1 推导结果 3. 快表的操作 3. 快表的优缺点 3.1 优 ...

  7. 【数据结构与算法】详解什么是图结构,并用代码手动实现一个图结构

    本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...

  8. [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  9. HBase数据结构与基本语法详解

    HBase数据结构与基本语法详解.背景: 阅读新闻 [日期:2019-01-06] 来源:Linux社区 作者:Linux [字体:大 中 小] HBase中的表一般有这样的特点: 1 大:一个表可以 ...

  10. BlockingQueue(阻塞队列)详解

    推荐:Java并发编程汇总 BlockingQueue(阻塞队列)详解 原文地址 BlockingQueue 一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程 ...

最新文章

  1. hdu1754(简单线段树)
  2. 关于Unity中的本地存储
  3. 最小方差问题---------------给你出道题
  4. gimp 架构_常见GUI 框架
  5. QT学习之路十二(基于Windows qt的聊天室)
  6. 车辆运动学模型和动力学模型
  7. 常见python爬虫框架_python的爬虫框架有哪些
  8. Jzoj5460【NOIP2017提高A组冲刺11.7】士兵训练
  9. 股市财富神话背后:黑庄黑嘴制造多少黑洞
  10. 人教版五年级下册计算机试题答案,人教版五年级下册语文试卷
  11. c语言中个各标点符号作用,C语言运算符和标点符号.xls
  12. 关于HTML预处理器Pug的使用文档
  13. Pytorch中torch.nn.DataParallel负载均衡问题
  14. 基于STM32和ESP8266的天气预报系统
  15. 安全扫描工具-appscan
  16. 移动端适配iphoneX、iPhone XS、iPhone XS Max、iPhone XR方法
  17. 珍藏5个在线免费接收国内外手机短信验证码的网络服务
  18. 南京大学java机试,2019南京大学计算机本科生开放日机试
  19. SSM项目————整合微信支付
  20. 前端MD5加密------js-md5

热门文章

  1. 移动端适配方案以及面试总结(初学者看出来)
  2. 查看和修改Windows系统的端口范围
  3. 云计算深度学习平台架构与实践的必经之路
  4. 小窍门:驱赶苍蝇的最佳方法
  5. 知识小罐头07(tomcat8请求源码分析 下)
  6. Python爬取m3u8格式的视频
  7. 一根苹果数据线背后的“血战”
  8. 如何用c语言编库存管理软件,2020年整理C语言库存管理系统.pdf
  9. 日课-5-30-曹全
  10. java计算机毕业设计新生报到管理系统源程序+mysql+系统+lw文档+远程调试