Python中的队列是什么?举例说明
队列是一种线性数据结构,它遵循**先进先出** (FIFO) 机制。
先进入队列的元素将首先被处理。
示例
可以通过公交车站的队列来理解队列数据结构。先到达公交车站的人是队列中的第一个人,其他人则在他到达后依次排队。当公交车到达时,先到达公交车站的人将是第一个上车的人,其余的人将按照到达公交车站的顺序上车。因此,遵循**先进先出**机制。
Python中队列的实现
Python中的队列可以通过多种方式实现,可以使用其他线性数据结构或Python库中的内置模块。
方法1 - 使用列表实现
Python中的队列可以使用列表实现。这种方法效率不高,因为在列表开头插入或删除元素需要O(n)时间,这比其他方法慢。
涉及的操作
append() - 此函数在队列末尾添加一个元素。
pop(0) - 此函数删除并返回队列中的第一个元素。
示例
queue=[] queue.append(1) queue.append(2) queue.append(3) print("Initial queue",queue) print("Element popped from the queue") print(queue.pop(0)) print(queue.pop(0)) print("Queue after popping some elements",queue)
输出
Initial queue [1, 2, 3] Element popped from the queue 1 2 Queue after popping some elements [3]
队列为空后,无法再删除更多元素。这样做会导致异常。
queue.pop(0) IndexError: pop from empty list
方法2 - 使用queue.Queue实现
这是使用Python内置模块实现队列的方法。我们需要从queue导入Queue。我们可以用特定大小初始化队列。大小为零表示无限队列。
涉及的操作
maxsize - 队列中允许的最大元素数
get() - 删除并返回队列中的第一个元素。如果队列为空,则等待直到队列至少有一个元素。
get_nowait() - 删除并返回队列中的第一个元素。如果队列为空,则引发异常。
put(item) - 在队列末尾添加一个元素。如果队列已满,则等待直到有空位可用。
put_nowait(item) - 在队列末尾添加一个元素。如果队列已满,则引发异常。
full() - 如果队列已满,则返回True,否则返回False。
empty() - 如果队列为空,则返回True,否则返回False
qsize() - 返回队列中存在的元素数量
示例
from queue import Queue q=Queue(maxsize=3) q.put(1) q.put(2) q.put(3) print("Is queue full",q.full()) print("Element popped from the queue") print(q.get()) print(q.get()) print("Number of elements in queue",q.qsize()) print("Is queue empty",q.empty())
输出
Is queue full True Element popped from the queue 1 2 Number of elements in queue 1 Is queue empty False
方法3 - 使用collections.deque实现
这是在Python中实现队列的另一种方法。我们需要从collections模块导入deque。
涉及的操作
append() - 此函数在队列末尾添加一个元素。
popleft() - 此函数以O(1)的时间复杂度删除并返回队列中的第一个元素。
示例
from collections import deque queue=deque() queue.append(1) queue.append(2) queue.append(3) print("Intial queue: ",queue) print("Element popped from the queue") print(queue.popleft()) print(queue.popleft()) print("Queue after popping some elements: ",queue)
输出
Intial queue: deque([1, 2, 3]) Element popped from the queue 1 2 Queue after popping some elements: deque([3])
在空deque上使用popleft()函数将引发异常。