【数据结构】队列

定义

只允许在一端进行插入数据,另一端删除数据的特殊线性表,队列具有先进先出的特性(FIFO),进行插入操作的一端称为队尾,进行删除操作的一端称为队头

链式队列

结构体定义
cpp 复制代码
typedef int Qdata;
typedef struct Qnode
{
	Qdata x;
	struct Qnode* next;
}Qnode;

typedef struct MQueue
{
	Qnode* head;
	Qnode* tail;
	int size;
}MQueue;
初始化和销毁
cpp 复制代码
void Qinit(MQueue* qs)
{
	assert(qs);
	qs->head = qs->tail = NULL;
	qs->size = 0;
}

void Qdel(MQueue* qs)
{
	assert(qs);
	Qnode* cur = qs->head;
	while (cur)
	{
		Qnode* next = cur->next;
		free(cur);
		cur = next;
	}
	qs->head = qs->tail = NULL;
	qs->size = 0;
}
入队列和出队列
cpp 复制代码
void Qpush(MQueue* qs, Qdata x)
{
	assert(qs);
	Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));
	if (newnode == NULL)
	{
		perror("newnode malloc fail");
		return;
	}
	newnode->x = x;
	newnode->next = NULL;
	if (qs->head == NULL)
	{
		assert(qs->tail == NULL);
		qs->head = qs->tail = newnode;
	}
	else
	{
		qs->tail->next = newnode;
		qs->tail = newnode;
	}
	qs->size++;
}

void Qpop(MQueue* qs)
{
	assert(qs);
	assert(qs->size != 0);
	Qnode* next = qs->head->next;
	free(qs->head);
	qs->head = next;

	if (qs->head == NULL) qs->tail = NULL;
	qs->size--;
}
功能实现
cpp 复制代码
int Qsize(MQueue* qs)
{
	assert(qs);
	return qs->size;
}

bool Qempty(MQueue* qs)
{
	assert(qs);
	return qs->size == 0;
}

Qdata Qfront(MQueue* qs)
{
	assert(qs);
	assert(!Qempty(qs));
	return qs->head->x;
}

Qdata Qback(MQueue* qs)
{
	assert(qs);
	assert(!Qempty(qs));
	return qs->tail->x;
}
相关推荐
彧azz9 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
鹿角片ljp17 小时前
LeetCode 31:下一个排列|右找小,右找大,交换,右反转
java·数据结构·算法
彧azz17 小时前
B树原理与C语言实现
c语言·数据结构·b树
蓝速科技17 小时前
酒店门店 AI 数字人前台场景适配与落地指南
大数据·运维·数据结构·数据库·人工智能·科技
LuminousCPP18 小时前
数据结构-排序(三):快速排序进阶|挖坑法、双指针交换与手动栈非递归实现
c语言·数据结构·笔记·算法·排序算法
linx29518 小时前
单元三 · 那 C 的底层知识怎么办
c语言·开发语言·数据结构·c++·嵌入式硬件
zander25819 小时前
LeetCode 128. 最长连续序列
数据结构·算法
linx29519 小时前
单元四 · 对称认知·上:内存与指针
c语言·开发语言·数据结构·嵌入式硬件·算法
-dzk-19 小时前
【二叉树】LC 236.二叉树的最近公共祖先
数据结构·二叉树