队列
最小的必需功能
与队列有两个基本操作:
功能名称* 提供功能 恩德(i)
插入元素一世在队列的尾巴。 Dequeue()
删除队列头部的元素。 此外,队列通常使用以下操作实现以节省计算:
功能名称* 提供功能 尺寸()
返回队列的当前大小 窥视()
返回队列头部的元素不改变队列 *不需要确切的名称。实际上,可以通过特殊语法直接通过给定的语言提供一些功能。
使用列表示例Python实现
以下是Python中的队列的实现。此实现使用Python列表作为其数据结构。
在这里,这是头是阵列(左侧)的最低索引,而且尾巴是最高可能的索引(在右侧)。
注意:使用其列表类型和少数功能在Python中为您提供队列。这是重新实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 13 14 15 16 18 19 20 21 21 22 23 22 22 22 27 22 22 22 |
|
示例:在队列中添加和删除项目
以下演示使用多于使用Python实现队列。
实例化队列:
>>> queue = queue()>>> queue.size()0
将三个人添加到队列中:
>>> queue.enqueue('Alice')>>>队列。Queue.enqueue('Bob')>>> queue.enqueue('查理')>>> queue.size()3
队列目前看起来像这样(记住,头在左边):
>>> queue.qlist ['alice','bob','查理']
Dequeue队列:
>>> queue.dequeue()'Alice'>>> queue.qlist ['bob','charlie'] >>> queue.dequeue()'bob'>>> queue.qlist ['查理'] >>> queue.dequeue()'charlie'>>> queue.qlist []
现在队列是空的,可以完成任何出差或偷看:
>>> queue.dequeue.dequeue()队列下溢>>> queue.peek()队列是空的
时间复杂性
队列的时间复杂性取决于所使用的数据结构的类型和所构建的特定实现。以下是对某些数据结构及其征管及其排行的复杂性分析:
虽然概念可能很简单,但编程队列并不像编程堆栈一样简单。自助餐厅线路再次用于解释为什么链接名单比一个更快大批到那个时刻Dequeuing.:
一个人离开自助餐厅线。这个人背后的每个人都必须前进。在一个数组中,这个过程一次发生一个,只有一个人一次可以移动。第一个人离开。然后第二人称前进以填补第一个人留下的空间,然后第三人称前进,以填补第二个人留下的空间等。这条线确实会非常缓慢地移动。
在最好的和最糟糕的情况,每个人都必须向前前进1.这需要 时间,因为动作的数量取决于人数排队。
但是,在链接名单的情况下,仅限1人必须搬家。这就像一个自助餐厅线,订单推土机前进,而不是整行本身。一旦链接的名单向线路前方的人排出,下一个人就会成为线路的新前面。他们和其他人排队,不必迈出前进。因为这个操作不依赖于行的数量是多大的,所以它需要 或常数,时间。
示例问题
考虑一条10人等待在快餐店购买食物。想象一下这条线由a表示队列。
- 这个队列的头部在哪里,前面的人或背部的人?
- 如果前面的人购买了他们的食物和叶子,有多少人需要移动(不包括留下的人)?
- 这个O(n)时间或O(1)时间吗?此队列是否使用数组或链接列表实现?
A1。队列的头部是线前面的人。
A2。9人必须搬家(10人减去1人左边)。
A3。这是o(n)时间,因为它取决于线条中的人数(在这种情况下,10)。此队列是使用数组实现的。
标准应用程序
队列最常用于实现列表,以这样的方式可以以它们到达的相同顺序检索项目。它们在各种领域提供了许多实际应用,例如在操作系统,邮件服务,CPU调度,电梯和键盘缓冲中。
队列在网络中非常有用,特别是对于互联网。例如,当您向同一个人发送两个文本时,您的手机可能会说“发送2.”网络使用队列来存储您的文本,以便它们以与您发送的顺序到达。或者,当您向网站发送数据时,您需要确保数据以正确的顺序获得。因此,该网站有一个队列,它会收集您的数据,因为它等待它被处理。
循环队列
有几种基本方法可以实现队列。首先是只是制作一个阵列并将所有元素换档以适应留线和出口。如上所述,这是慢的。
先前方法的缓慢是,具有许多元素,换档需要时间。因此,实现队列的另一种方法是改变延时和排出点。在上述自助餐厅线示例中,如果每个人离开线路,则线路不断向后移动,那么人们不需要向前或向后致力于,从而节省时间。
但是,这引入了循环队列的一个重要不变 - 它们必须具有最大容量!否则,如果您已到达队列的末尾,则无法了解何处,因此损失将会丢失。
在此实现中,占位符在队列中使用。这是为了让队列不会失去它的地方,如果它在中间空虚。这也使用列表作为其数据结构。以下代码演示了循环队列的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|
要了解此循环实现,请将数组视为圆圈。当元素被驱逐时,队列不会将所有元素转移到队列的开始。相反,该类将队列的开始转移回来。最终,队列的开始将转移到目前为止,队列将延伸超出数组的末尾。这是圆圈进入的地方。当队列到达数组的末尾时,它会绕过阵列的开头。我们使用Modulo Math进行此包装头和尾巴队列。