队列(Queue)是一种先进先出(FIFO, First In First Out)的数据结构,即最先被插入队列的数据会最先被删除。队列广泛应用于计算机科学中,特别是在任务调度、缓冲区管理、网络数据传输等领域。
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
使用数组以及队列来实现队列的对比
1. 数组实现队列的基本原理
使用数组来实现队列时,可以借用一个固定大小的数组,维护两个指针:front 和 rear。
当队列为空时,front == rear,而当队列满时,rear 达到数组的末尾。
2. 链表实现队列的基本原理
使用链表实现队列时,我们可以通过 头指针(front) 和 尾指针(rear) 来维护队列。
链表的每个节点包含数据部分和指向下一个节点的指针。队列的 入队 操作将元素添加到链表的尾部,出队 操作从链表的头部移除元素。
3. 数组队列与链表队列的对比
4.对比数组队列和链表队列的时间复杂度
数组实现队列:
链表实现队列:
综上 使用链表来实现队列
1. 创建新节点
每当我们将一个新的元素加入队列时,需要首先创建一个新的节点。这个节点会存储数据并且需要指向链表中的下一个节点。
需要分配内存来存储新节点,并将其 data 字段设置为要入队的数据,next 字段设置为 NULL(因为它是当前链表的最后一个节点)。
2. 检查队列是否为空
3. 将新节点添加到队列尾部
4. 确保尾指针正确更新
pq->phead == 0:这部分代码在检查 phead 是否为空。0 在 C 语言中等价于 NULL,即表示指针没有指向任何有效的内存地址。
步骤说明:
假设我们有一个队列 Queue,它是通过链表实现的,其中 phead 指向队列的头部,ptail 指向队列的尾部。每个节点包含数据和指向下一个节点的指针。
1. 检查队列是否为空:
在进行出队操作之前,我们需要检查队列是否为空。如果队列为空,则不能出队,因为没有元素可供删除。
2. 保存头部元素的数据:
我们需要保存 phead 指针指向的元素数据,因为在删除节点时,我们将失去对该数据的引用。如果要返回出队的元素数据,必须先保存它。
3. 更新 phead 指针:
将 phead指向队列的下一个节点,即 phead = phead->next。这样,队列头部的元素就被“删除”了。phead 指针现在指向新的队头元素。
4. 处理队列为空的情况:
如果 phead 变为 NULL,即队列中没有元素时,需要将 ptail 指针也设置为 NULL,因为队列为空时,phead 和 ptail 都应该为 NULL。
5. 释放已删除节点的内存:
如果我们使用动态内存分配(例如 malloc),需要释放 phead 指向的节点的内存,以避免内存泄漏。
在确定队列不为空的情况下,取队头数据非常简单。
检查队列是否为空:
访问队头数据:
返回队头数据:
访问队尾数据:
返回队尾数据:
通常情况下,使用计数器(方法一)更加高效,即在每次入队列和出队列时,都会对pq->size进行改变, 在入队列时则 pq->size++,在出队列时则 pq->size--。
这使我们可以直接得出队列的有效元素个数,避免了遍历链表(这种方法在计算队列大小时需要遍历整个链表,因此时间复杂度是 O(n)。在每次查询时,性能较差)。
以上为队列结构的介绍,感谢敢看!
您需要 登录 才可以下载或查看,没有账号?立即注册
使用道具 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
特级红客
2 小时前
昨天 23:39
昨天 23:38
昨天 23:35
昨天 18:07
中国红客联盟公众号
联系站长QQ:5520533