【数据结构】队列

定义

只允许在一端进行插入数据,另一端删除数据的特殊线性表,队列具有先进先出的特性(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;
}
相关推荐
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠4 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾4 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres8214 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q5 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒5 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记5 天前
单项不带头不循环链表
数据结构·链表
小糯米6015 天前
JS 数组
数据结构·算法·排序算法
小欣加油5 天前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展
凌波粒5 天前
LeetCode--90.子集II(回溯算法)
数据结构·算法·leetcode