【数据结构入门】队列(Queue)详解(定义、销毁、入队、出队等)| 图解数据结构,超详细哦~
文章目录
- (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)详解(定义、销毁、入队、出队等)| 图解数据结构,超详细哦~相关推荐
- 栈(Stack)和队列(Queue)详解
1. 什么是栈,栈存储结构详解 同顺序表和链表一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如图 1 所示. 图 1 栈存储结构示意图 从图 1 我们看到,栈存储 ...
- Python队列Queue详解,超详细
Queue queue模块简介 queue.Queue(maxsize=0) queue.LifoQueue(maxsize=0) queue.PriorityQueue(maxsize=0) que ...
- 山西2019数据结构专升本_山西省2017年专升本选拔考试(C程序设计数据结构)历年真题详解...
山西省2017年专升本选拔考试(C程序设计数据结构)历年真题详解 说明:本试题分C程序设计和数据结构(C语言版)两部分,各占100分,满分200分,考试时间150分钟. 第一部分C程序设计 一.单项选 ...
- 山西2019数据结构专升本_山西省2018年专升本选拔考试(C程序设计数据结构)历年真题详解...
1 山西省 2018 年专升本选拔考试( C 程序设计数据结构)历年真题详 解 说明 : 本试题分 C 程序设计和数据结构 (C 语言版 ) 两部分, 各占 100 分, 满分 200 分,考试时间 ...
- c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列图文详解
前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法-栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去).而队列就好比是一个隧道,后面 ...
- Redis从入门到精通之底层数据结构快表QuickList详解
文章目录 0.前言 1. 快表的结构 2. Redis 6.0 快表quicklist 基本结构 2.1 成员变量 2.1 主要操作 2.1 推导结果 3. 快表的操作 3. 快表的优缺点 3.1 优 ...
- 【数据结构与算法】详解什么是图结构,并用代码手动实现一个图结构
本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...
- [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- HBase数据结构与基本语法详解
HBase数据结构与基本语法详解.背景: 阅读新闻 [日期:2019-01-06] 来源:Linux社区 作者:Linux [字体:大 中 小] HBase中的表一般有这样的特点: 1 大:一个表可以 ...
- BlockingQueue(阻塞队列)详解
推荐:Java并发编程汇总 BlockingQueue(阻塞队列)详解 原文地址 BlockingQueue 一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程 ...
最新文章
- hdu1754(简单线段树)
- 关于Unity中的本地存储
- 最小方差问题---------------给你出道题
- gimp 架构_常见GUI 框架
- QT学习之路十二(基于Windows qt的聊天室)
- 车辆运动学模型和动力学模型
- 常见python爬虫框架_python的爬虫框架有哪些
- Jzoj5460【NOIP2017提高A组冲刺11.7】士兵训练
- 股市财富神话背后:黑庄黑嘴制造多少黑洞
- 人教版五年级下册计算机试题答案,人教版五年级下册语文试卷
- c语言中个各标点符号作用,C语言运算符和标点符号.xls
- 关于HTML预处理器Pug的使用文档
- Pytorch中torch.nn.DataParallel负载均衡问题
- 基于STM32和ESP8266的天气预报系统
- 安全扫描工具-appscan
- 移动端适配iphoneX、iPhone XS、iPhone XS Max、iPhone XR方法
- 珍藏5个在线免费接收国内外手机短信验证码的网络服务
- 南京大学java机试,2019南京大学计算机本科生开放日机试
- SSM项目————整合微信支付
- 前端MD5加密------js-md5