【数据结构】队列

定义

只允许在一端进行插入数据,另一端删除数据的特殊线性表,队列具有先进先出的特性(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;
}
相关推荐
Yang_jie_0311 小时前
笔记:数据结构(栈是否使用底指针以及头指针的初始化值)
数据结构·笔记·算法
lueluelue4713 小时前
LeetCode:滑动窗口
数据结构·算法·leetcode
码少女14 小时前
数据结构——冒泡排序及优化
数据结构·算法·排序算法
青梅橘子皮14 小时前
string---入门OJ题(1)
数据结构·算法
小高Baby@14 小时前
单链表的删操作
数据结构·算法·golang
qq_4542450314 小时前
BasicMethod.Map 设计框架:8 个并行基础模块的数学根基与实现
数据结构·算法·c#
青山木14 小时前
Hot 100 --- 二叉树与递归
java·数据结构·算法·leetcode·深度优先
ysa05103016 小时前
【板子】树上启发式合并
数据结构·c++·笔记·算法
2301_8002561117 小时前
数据结构基础期末复习例题
数据结构·算法
tachibana217 小时前
hot100 将有序数组转换为二叉搜索树(108)
java·数据结构·算法·leetcode