【数据结构】队列

定义

只允许在一端进行插入数据,另一端删除数据的特殊线性表,队列具有先进先出的特性(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;
}
相关推荐
bnmoel15 小时前
数据结构深度剖析顺序表:结构、扩容与增删查改全解析
c语言·数据结构·算法·顺序表
Liangwei Lin15 小时前
LeetCode 45. 跳跃游戏 II
数据结构·算法·leetcode
枕星而眠15 小时前
一篇吃透 C++ 核心基础:初始化、引用、指针、内联、重载、右值引用
开发语言·数据结构·c++·后端·visual studio
平行侠16 小时前
026FFT快速乘法 - 从信号处理到大数计算的革命
数据结构·算法·信号处理
C雨后彩虹16 小时前
猴子爬山问题
java·数据结构·算法·华为·面试
知识分享小能手16 小时前
R语言入门学习教程,从入门到精通,R语言数据结构(4)
数据结构·学习·r语言
无限进步_16 小时前
【C++】智能指针族谱:auto_ptr、unique_ptr、shared_ptr
java·开发语言·数据结构·c++·算法
洛水水16 小时前
B树与B+树详解
数据结构·b树
qingy_204616 小时前
Redis Zset 底层数据结构及其使用场景
数据结构·数据库·redis
Lazionr16 小时前
数据结构堆详解:原理、实现与应用
数据结构·算法