数据结构入门 — 队列

本文属于数据结构专栏文章,适合数据结构入门者学习,涵盖数据结构基础的知识和内容体系,文章在介绍数据结构时会配合上动图演示,方便初学者在学习数据结构时理解和学习,了解数据结构系列专栏点击下方链接。


  • 博客主页:Duck Bro 博客主页
  • 系列专栏:数据结构专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

数据结构入门 --- 队列

本文关键字:队列、队列概念及结构、队列实现

文章目录

  • [数据结构入门 --- 队列](#数据结构入门 — 队列)
    • 一、队列的概念及结构
      • [1. 队列的概念](#1. 队列的概念)
      • [2. 队列的结构](#2. 队列的结构)
    • 二、队列的实现
      • [1. 队列结构组成](#1. 队列结构组成)
      • [2. 初始化队列](#2. 初始化队列)
      • [3. 队尾入队列](#3. 队尾入队列)
      • [4. 队头出队列](#4. 队头出队列)
      • [5. 获取队列头部元素](#5. 获取队列头部元素)
      • [6. 获取队列队尾元素](#6. 获取队列队尾元素)
      • [7. 获取队列中有效元素个数](#7. 获取队列中有效元素个数)
      • [8. 检测队列是否为空](#8. 检测队列是否为空)
      • [9. 销毁队列](#9. 销毁队列)

一、队列的概念及结构

1. 队列的概念

队列是一种数据结构,它遵循先进先出(First-in, First-out)原则。队列可以看作是一条排队等待服务的线程,其中最先加入队列的元素最先被处理,而最后加入队列的元素最后被处理。

队列有两个端点:队头和队尾。元素从队尾进入队列,从队头出队。队列的基本操作包括入队(enqueue)和出队(dequeue),以及获取队头和队尾元素的操作。队列在计算机科学中有广泛的应用,例如任务调度、缓存管理、路由算法等。

2. 队列的结构

队列的结构组成通常包括以下几个要素:

结构 作用
队列元素 队列中可存放的元素,可为任何数据类型
队列大小 队列可存放元素的最大数量,即队列的容量
队头指针 指向队头元素的指针,表示可以取出的元素
队尾指针 指向队尾元素的指针,表示可以插入的元素
入队操作 将元素插入队尾的操作
出队操作 将队头元素取出的操作
队列空判断 判断队列是否为空的操作
队列满判断 判断队列是否已满的操作(对于固定大小的队列)

二、队列的实现

1. 队列结构组成

队列结构由链表组成,使用头尾两个指针,用size记录队列里元素个数

c 复制代码
typedef int QueDatatype;
typedef struct QueList
{
	struct QueList* next;
	QueDatatype data;
 }QNode;

typedef struct QueHeadTail
{
	QNode* head;
	QNode* tail;
	int size;
}QHT;

2. 初始化队列

初始化将头尾两个指针置空,将size置为0

c 复制代码
void QueInit(QHT* pc)
{
	assert(pc);
	pc->head = pc->tail = NULL;
	pc->size = 0;
}

3. 队尾入队列

入队,用malloc开辟一个新的空间,分为两种情况当尾指针为空的时候和尾指针不为空时,详细见代码

c 复制代码
void QuePush(QHT* pc, QueDatatype x)
{
	assert(pc);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pc->tail == NULL)
	{
		pc->head = pc->tail = newnode;
	}
	else
	{
		pc->tail->next = newnode;
		pc->tail = newnode;
	}
	pc->size++;
}

4. 队头出队列

当头指针的下一个为空时要释放头指针指向的空间,并将头尾指针置为0

c 复制代码
void QuePop(QHT* pc)
{
	assert(pc);
	assert(!QueEmpty(pc));
	if (pc->head->next == NULL)
	{
		free(pc->head);
		pc->head = pc->tail == NULL;

	}
	else
	{
		QNode* next = pc->head->next;
		free(pc->head);
		pc->head = next;
	}
	pc->size--;
}

5. 获取队列头部元素

返回头指针所指向的元素

c 复制代码
QueDatatype QueFront(QHT* pc)
{
	assert(pc);

	return pc->head->data;
}

6. 获取队列队尾元素

返回尾指针所指向的元素

c 复制代码
QueDatatype QueLast(QHT* pc)
{
	assert(pc);
	return pc->tail->data;
}

7. 获取队列中有效元素个数

返回size的个数,即有效元素个数

c 复制代码
int QueSize(QHT* pc)
{
	assert(pc);
	return pc->size;

}

8. 检测队列是否为空

当头指针为空时,队列则为空

c 复制代码
bool QueEmpty(QHT* pc)
{
	assert(pc);
	return pc->head == NULL;
}

9. 销毁队列

先保存下一个数据地址,并释放当前位置的内存空间,并将头尾指针置为空,size置为0

c 复制代码
void QueDestroy(QHT* pc)
{
	assert(pc);
	QNode* cur = pc->head;
	while (cur)
	{
		QNode* delnext = cur->next;
		free(cur);
		cur = delnext;
	}
	pc->head = pc->tail = NULL;
	pc->size = 0;
}

相关推荐
SmartRadio9 分钟前
MK8000(UWB射频芯片)与DW1000的协议适配
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·dw1000
guygg8810 分钟前
基于捷联惯导与多普勒计程仪组合导航的MATLAB算法实现
开发语言·算法·matlab
fengfuyao98511 分钟前
遗传算法与粒子群算法求解非线性函数最大值问题
算法
LeetCode天天刷25 分钟前
【软件认证】比特翻转【滑动窗口】
算法
froginwe1125 分钟前
Rust 文件与 IO
开发语言
源代码•宸27 分钟前
Leetcode—1123. 最深叶节点的最近公共祖先【中等】
经验分享·算法·leetcode·职场和发展·golang·dfs
liulilittle28 分钟前
LIBTCPIP 技术探秘(tun2sys-socket)
开发语言·网络·c++·信息与通信·通信·tun
yyy(十一月限定版)28 分钟前
c++(3)类和对象(中)
java·开发语言·c++
s砚山s30 分钟前
代码随想录刷题——二叉树篇(十三)
数据结构·算法
落羽凉笙31 分钟前
Python基础(4)| 玩转循环结构:for、while与嵌套循环全解析(附源码)
android·开发语言·python