数据结构——队列的实现

目录

队列的概念和结构

队列的实现

队列初始化

入队操作

出队操作

取队头的元素

判断队列是否为空

队列的销毁


队列的概念和结构

队列:只允许在一端进行插入数据操作,另一端进行删除数据操作的特殊线性结构,具有"先进先出"的特点,进行插入数据的一端称为队尾,出数据的一端称为队头。

队列的实现

队列的实现还是建立三个文件,一个头文件,两个源文件。

cs 复制代码
typedef int QueDateType;

typedef struct SList {
	struct SList* next;
	QueDateType date;
}SL;

typedef struct Queue {
	SL* head;
	SL* tail;
	int size;
}Queue;

创建两个结构体,队列的实现是用链表来实现的,如果使用数组来实现,那么效率就太低了,在进行数据删除时,需要挪动数据,在链表中删除数据就是头删,插入数据就是尾插,效率远比使用数组实现高效。

SList是一个节点,成员next 存储下一个节点的地址,date存储该节点的数据,Queue结构体包含两个节点指针,一个指向头,一个指针尾,还有size来统计节点个数。

队列初始化

函数声明

cs 复制代码
void QueInit(Queue* p);

函数定义

cs 复制代码
void QueInit(Queue* p)
{
	assert(p);
	p->head = p->tail = NULL;
	p->size = 0;
}

初始化队列,没有节点需要将头指针和尾指针置空,size置为0。

入队操作

函数声明

cs 复制代码
void QuePush(Queue* p, QueDateType x);

函数定义

cs 复制代码
void QuePush(Queue* p, QueDateType x)
{
	assert(p);
	SL* newnode = (SL*)malloc(sizeof(SL));
	if (newnode == NULL)
	{
		perror("QuePush:malloc");
		return;
	}
	newnode->date = x;
	newnode->next = NULL;
	if (p->size == 0)
	{
		p->head = p->tail = newnode;
	}
	else
	{
		p->tail->next = newnode;
		p->tail = newnode;
	}
	p->size++;
}

队列的入队操作,根据队列"先进先出"特点,所以我们插入数据在尾部。

先对结构体指针断言,用malloc函数申请一片空间来存储一个节点,这时就有两种情况,一个是队列为空,和队列不为空。当队列为空时,头指针和为尾指针都指向新开辟的节点,当队列不为空,就只需要改变尾指针就可以,最后size++。

出队操作

函数声明

cs 复制代码
void QuePop(Queue* p);

函数定义

cs 复制代码
void QuePop(Queue* p)
{
	assert(p);
	assert(p->head != NULL);
	SL* next = p->head->next;
	free(p->head);
	p->head = NULL;
	p->head = next;
	p->size--;
}

出队操作不能一直执行,当队列为空时不可执行,因此对其断言,头指针不可以为空。定义一个节点指针来保存头指针的下一个节点的地址,这样释放头指针后还可以找到下一个节点,最后size--。

取队头的元素

函数声明

cs 复制代码
QueDateType QueTop(Queue* p);

函数定义

cs 复制代码
QueDateType QueTop(Queue* p)
{
	assert(p);
	assert(!QueJuS(p));
	return p->head->date;
}

除了对结构体判空,还需要对节点个数断言,没有节点就不进行该操作,反之返回队头元素。

判断队列是否为空

函数声明

cs 复制代码
bool QueJuS(Queue* p);

函数定义

cs 复制代码
bool QueJuS(Queue* p)
{
	assert(p);
	return p->size == 0;
}

该函数返回类型为布尔类型,当size等于0时返回true,反之返回false。

队列的销毁

函数声明

cs 复制代码
void QueDestroy(Queue* p);

函数定义

cs 复制代码
void QueDestroy(Queue* p)
{
	assert(p);
	SL* cur = p->head;
	while (cur)
	{
		SL* next = cur->next;
		free(cur);
		cur = next;
	}
	p->size = 0;
}

每插入一个节点就需要进行malloc,所以销毁队列时需要对每一个节点进行空间释放,最后size置为0。

相关推荐
@卞22 分钟前
排序算法(3)--- 交换排序
数据结构·算法·排序算法
嘻嘻嘻开心42 分钟前
C语言学习笔记
c语言·数据结构·算法
沈阳信息学奥赛培训1 小时前
CCF GESP 2025/12/24 模拟测试 C++ 4级 编程题2
数据结构·算法
hope_wisdom2 小时前
C/C++数据结构之队列基础
c语言·数据结构·c++·队列·queue
脏脏a5 小时前
链式存储范式下的二叉树:基础操作实现解析
c语言·数据结构·算法·二叉树
sin_hielo5 小时前
leetcode 2402(双堆模拟,小根堆)
数据结构·算法·leetcode
AI科技星6 小时前
张祥前统一场论:空间位移条数概念深度解析
数据结构·人工智能·经验分享·算法·计算机视觉
雪花desu6 小时前
【Hot100-Java简单】:两数之和 (Two Sum) —— 从暴力枚举到哈希表的思维跃迁
java·数据结构·算法·leetcode·哈希表
2401_841495646 小时前
【游戏开发】登山赛车
数据结构·python·游戏·游戏开发·pygame·登山赛车游戏·游戏打包发布
爱吃生蚝的于勒7 小时前
【Linux】深入理解软硬链接
linux·运维·服务器·c语言·数据结构·c++·算法