数据结构——队列(C语言)

需求:无

本篇文章将解决一下几个问题:

  1. 队列是什么?
  2. 如何实现一个队列?
  3. 什么场景下会用队列?

队列的概念:

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

队列的实现:

  • 队列也可以使用链表或者数组来实现。但是一般都是用链表来实现,如果用数组的话,出队列的时候,会移动数据,效率很低(O(N))。
  • 用链表实现,出队列时要记录好头节点的下一个节点。

队列的判空:当元素个数为0,就是一个空队列,这时不允许出队列。

队列元素的个数:当入队列的时候,size就+1,出队列时就-1,当我们需要元素个数的时候就不需要遍历,用O(1)的时间复杂度就可以完成队列的元素个数。

队列的应用场景:

  • 其实在我们的生活中,到处都是队列的身影,像排队买票的时候,医院叫号的时候....
  • 还有就是想大麦app上抢演唱会的票等等,都有队列的身影。

队列的源码:

复制代码
void QueueInit(Queue* pq)
{
	assert(pq);

	pq->tail = pq->head = NULL;
	pq->size = 0;
}

void QueueDestroy(Queue* pq)
{
	assert(pq);

	QueueNode* cur = pq->head;
	while (cur)
	{
		QueueNode* next = cur->next;
		free(cur);
		cur = next;
	}
}

void QueuePush(Queue* pq, QueueDateType x)
{
	assert(pq);

	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	newnode->next = NULL;
	newnode->val = x;

	if (pq->head == NULL)
	{
		pq->tail = pq->head = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}

	pq->size++;
}

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
		pq->size--;
	}
	else
	{
		QueueNode* next = pq->head->next;
		free(pq->head);

		pq->head = next;
		pq->size--;
	}
}

QueueDateType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->head->val;
}

QueueDateType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->tail->val;
}

int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->head == NULL;
}

void QueuePrint(Queue* pq)
{
	assert(pq);

	while (pq->head)
	{
		printf("%d ", pq->head->val);
		pq->head = pq->head->next;
	}
	printf("\n");
}

typedef int QueueDateType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QueueDateType val;
}QueueNode;


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

void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
void QueuePush(Queue* pq,QueueDateType x);
void QueuePop(Queue* pq);
QueueDateType QueueFront(Queue* pq);
QueueDateType QueueBack(Queue* pq);
int QueueSize(Queue* pq);
bool QueueEmpty(Queue* pq);
void QueuePrint(Queue* pq);
相关推荐
ゞ 正在缓冲99%…4 分钟前
leetcode1770.执行乘法运算的最大分数
java·数据结构·算法·动态规划
渡我白衣9 分钟前
链接的迷雾:odr、弱符号与静态库的三国杀
android·java·开发语言·c++·人工智能·深度学习·神经网络
A.A呐10 分钟前
【QT第三章】常用控件1
开发语言·c++·笔记·qt
abcefg_h13 分钟前
链表算法---基本算法操作(go语言版)
算法·链表·golang
小O的算法实验室13 分钟前
2022年IEEE TITS SCI2区TOP,基于切线交点和目标引导策略的无人机自主路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
熊猫_豆豆28 分钟前
QT6 写一个诗词鉴赏、朗诵、阅读程序(智谱清言AI赏析接口)
c++·ai·智谱清言·古诗鉴赏
morn_venus41 分钟前
使用qt控制台抓取tcp数据包
c++
say_fall1 小时前
C语言容易忽略的小知识点(1)
c语言·开发语言
Mr_Oak1 小时前
【multi-model】moco系列&SimCLR&BEiT
人工智能·深度学习·神经网络·算法·计算机视觉·transformer·对比学习
尼古拉斯·纯情暖男·天真·阿玮1 小时前
动态规划——子序列问题
java·算法·动态规划