【数据结构】队列的基本概念及常见操作

队列是一种常见的数据结构,可以用于很多实际应用中,比如操作系统中的进程调度、网络数据包的传输等。在本篇博客中,我们将介绍队列的基本操作和实现方式。

队列的定义和特点

 它遵循先进先出(FIFO)的原则。在队列中,新的元素被插入到队列的尾部,而从队列中删除元素的操作总是从队列的头部进行。和栈一样,队列也可以被简单地理解为一种容器,队尾插入,队头删除。

队列的基本操作包括初始化队列、销毁队列、入队、出队、获取队头元素、获取队尾元素、判断队列是否为空和获取队列的大小。

初始化队列

在使用队列之前,需要先进行初始化操作。初始化操作主要是将队列的头指针和尾指针都指向空节点,并将队列的大小初始化为0。

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

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

销毁队列

在不再使用队列时,需要进行销毁操作。销毁操作主要是释放队列中所有节点的内存空间,并将队列的头指针和尾指针都指向空节点。这里注意:队列的大部分操作都需要判空进行断言。

void QueueDestroy(Que* 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;
}

入队

将新的元素插入到队列的尾部。入队操作主要包括创建一个新的节点,并将新节点的数据设置为要插入的元素,然后将新节点插入到队列的尾部,并更新队列的尾指针和大小。

void QueuePush(Que* pq, QDataType x) {
	assert(pq);

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

出队

从队列的头部删除一个元素。出队操作主要是将队列的头指针指向下一个节点,并释放原来头节点的内存空间,并更新队列的大小。

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

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

获取队头、队尾元素

返回队列的头节点的数据。

QDataType QueueFront(Que* pq) {
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->head->data;
}
QDataType QueueBack(Que* pq) {
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->tail->data;
}

 判断队列是否为空

如果队列的大小为0,则队列为空。

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

	return pq->head == NULL;
}

 获取队列的大小

返回队列中元素的个数。

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

	return pq->size;
}

 

 结语

希望本篇博客能够对你理解队列有所帮助,并能够在实际应用中灵活运用队列的特性。队列作为一种常见的数据结构,可以解决很多实际问题,比如任务调度、缓冲区管理、广度优先搜索等。如果你对队列还有其他疑问或需要进一步了解,欢迎提问。 

 

 

 

 

 

 

 

 

 

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值