数据结构【队列】值得一看!

数据结构【队列】值得一看!_第1张图片

✨Blog:不会敲代码的小张:)
推荐专栏:C语言Cpp‍️、数据结构初阶
座右铭:“記住,每一天都是一個新的開始
本章内容:《队列》的介绍✨

队列思想

队列,就是常用的数据结构之一。队列的特征是先进先出(First-In-First-Out),就相当于我们现实中排队的样子。

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,以及在表的后端(back)进行插入操作。和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
数据结构【队列】值得一看!_第2张图片

目录

  • 队列思想
  • 队列的创建
  • 初始化
  • 销毁
  • 插入
  • 删除
  • 队列的大小
  • 判空
  • 返回队头数据
  • 返回队尾数据

队列的创建

下面代码中用结构体把指针给封装了起来,方便后续使用。
如果不封装起来,后面函数传参的时候,会比较麻烦

typedef int QDatatype;
//队列节点
typedef struct QueueNode
{
	struct QueueNode* next;
	QDatatype data;
}QNode;
//我们这里用结构体把队列的指针封装起来
typedef struct Queue
{
	QNode* head;//头指针
	QNode* tail;//尾指针
	int size;
}Queue;

初始化

最开始头指针尾指针都为空,size为0

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

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

销毁

创建一个cur指针指向队头,while循环,如果cur不为空就说明里面还有数据,保留cur下一个指针的位置,释放当前cur,然后再把刚刚保留的next指针给cur。

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

	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

插入

首先我们malloc一个空间,然后把要插入进去的数据放进data里,next掷为空,如果队头为空,那么就是一个空队列(队尾如果不是空就出问题了,所以断言一下),我们需要把newnode赋值给队头队尾,如果队头不为空,那么我们就只需要在队尾的位置插入,然后再更新队尾指针即可。

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

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	
	if (pq->head == NULL)
	{
		assert(pq->tail == NULL);
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	pq->size++;
}

删除

既然是删除,那么队列里一定要有数据,所以要先断言,如果头指针和尾指针相等,说明队列只有一个元素,那么直接free即可,那么else我们需要先保留队头的指针,和队头下一个的指针位置,然后free掉队头元素,再把刚刚保留的next指针更新到对头。

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

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

队列的大小

直接返回size

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

	return pq->size;
}

判空

用bool做为返回值,如果队头和队尾都为空,那么就是空队列。

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

	return pq->head == NULL && pq->tail == NULL;
}

返回队头数据

队列不能为空,然后直接返回队头指向的元素

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

	return pq->head->data;
}

返回队尾数据

队列不能为空,然后直接返回队尾指向的元素

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

	return pq->tail->data;
}

你可能感兴趣的:(数据结构初阶,C语言,数据结构,c语言,经验分享)