数据结构入门 — 队列

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


  • 博客主页: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;
}

相关推荐
竹子_238 分钟前
《零基础入门AI:传统机器学习进阶(从拟合概念到K-Means算法)》
人工智能·算法·机器学习
hweiyu0020 分钟前
IDEA搭建GO环境
开发语言·后端·golang·intellij-idea·idea·intellij idea
HW-BASE1 小时前
C语言的结构体与联合体
c语言·单片机·嵌入式·编程·c
归辞...1 小时前
「iOS」————单例与代理
开发语言·javascript·ios
vision_wei_1 小时前
Redis中间件(二):Redis协议与异步方式
网络·数据库·c++·redis·分布式·缓存·中间件
设计师小聂!1 小时前
力扣热题100------136.只出现一次的数字
数据结构·算法·leetcode
崎岖Qiu1 小时前
leetcode643:子数组最大平均数 I(滑动窗口入门之定长滑动窗口)
java·算法·leetcode·力扣·双指针·滑动窗口
多思考少编码2 小时前
[GESP202309 四级] 2023年9月GESP C++四级上机题题解,附带讲解视频!
开发语言·c++·算法
TDengine (老段)2 小时前
TDengine IDMP 背后的技术三问:目录、标准与情景
大数据·数据库·物联网·算法·时序数据库·iot·tdengine
Crazy learner2 小时前
C语言fgets函数详解:安全读取字符串的利器
c语言·开发语言·算法