【数据结构】解析队列各接口功能实现

目录

前言:

一、队列概述:

1.队列的概念:

二、队列的各种接口功能实现:

1.初始化队列:

2.入队(尾插):

3.出队(头删):

4.查看队头:

5.查看队尾

6.查看队列大小:

7.判断队列是否为空:

8.队列的销毁:

总结:

前言:

        在上一章中我们使用数组实现了数组栈各接口功能的实现,对各接口的原理和工作方式有了一定了解,而今天,在这节课我们将使用链表来实现队列的相关接口功能。现在我们进入今天的学习。

一、队列概述:

1.队列的概念:

        队列是一种特殊的线性表,它允许在表的的前端进行删除,而在表后端进行插入操作,也就是先进先出。它和栈一样,队列也是一种操作说限制的线性表。进行插入操作的一端称之为队尾,进行删除操作的端称之为对头。

队列的元素又叫队列元素。在队列中插入一个队列元素称之为入队,从队列中删除一个队列元素称之为出队。

二、队列的各种接口功能实现:

        队列的实现也可以用数组,但是我们一般通过链表来实现,因为链表实现会更好。

1.初始化队列:

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

②.判断非空之后,只需要将头指针与尾指针置空,和size赋值0就可了。

void QueueInit(Queue* pq)
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
pq->size = 0;

}

2.入队(尾插):

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

②.判断非空之后,申请新节点,并向新节点中存入数据,存入之后进行插入。

③.节点插入时需分两种情况进行讨论,一种是在队列为空时,及内部无有效数据,此时只需要让头指针与尾指针都指向新节点即可,是新节点成为队列中唯一有效数据。另外一种就是当队列中有有效数据时,此时首先时原本为尾节点的next指向新节点,再更新尾节点就可以了。

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

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

3.出队(头删):

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

②.再出队之前应需要对队列内容量进行判断,方队没有有效数据的空队列进行错误操作。

③.满足条件之后,使第二节点成为第一节点,再释放第一节点,同时注意对操作后将队列删空的情况进行区别处理。

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->head != NULL);

	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--;

}

4.查看队头:

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

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


	return pq->head->data;
}

5.查看队尾

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

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

	return pq->tail->data;
}

6.查看队列大小:

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

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

	return pq->size;
}

7.判断队列是否为空:

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

int QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->size == 0;
}

这里也可以直接返回队列是否为空的判断结果:
 

bool QEmpty(Q* pq)
{
    assert(qp);
    return qp->head==NULL;
}

8.队列的销毁:

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

②.从头结点开始,遍历释放所有节点,最后再将头指针和尾指针进行置空。

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;
}

总结:

        到此我们关于队列的各接口功能实现就全部结束了,本文中我是通过链表来实现队列的,大家感兴趣也可用数组自己实现一下。

文章仍有许多不足,欢迎大家私信交流。

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值