Python中的队列有哪几种
时间: 2023-06-11 18:05:05 浏览: 49
在Python中,常用的队列有三种:普通队列(Queue)、优先队列(PriorityQueue以及双端队列deque)。其中,普通队列是先进先出的,优先队列是按照队列中元素的优先级进行出队操作,双端队列是可以从队列的两端分别进行插入和删除操作的队列。
相关问题
线程池的阻塞队列有哪几种
线程池的阻塞队列主要有以下几种:
1. LinkedBlockingQueue:一个基于链表结构的阻塞队列,按照先进先出的原则对元素进行排序。
2. ArrayBlockingQueue:一个基于数组结构的有界阻塞队列,按照先进先出的原则对元素进行排序。
3. SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等待另一个线程的移除操作,否则插入操作一直处于阻塞状态。
4. PriorityBlockingQueue:一个具有优先级的无界阻塞队列,按照优先级顺序对元素进行排序。
5. DelayQueue:一个使用优先级队列实现的延迟无界阻塞队列,只有在延迟期满时才能从中提取元素。
代码演示:
```python
import queue
import threading
# 创建一个阻塞队列
q = queue.Queue()
# 定义一个线程函数
def worker():
while True:
item = q.get()
if item is None:
break
print(item)
q.task_done()
# 创建多个线程
threads = []
for i in range(5):
t = threading.Thread(target=worker)
t.start()
threads.append(t)
# 向队列中添加元素
for item in range(10):
q.put(item)
# 阻塞直到所有任务完成
q.join()
# 停止所有线程
for i in range(5):
q.put(None)
for t in threads:
t.join()
```
使用链表实现队列有几种类型?python
使用链表实现队列主要有两种类型:单向链表和循环链表。
1. 单向链表:单向链表是一种基本的链式结构,每个节点只包含一个指向下一个节点的指针。使用单向链表实现队列时,入队操作是在链表尾部添加一个节点,出队操作是从链表头部删除一个节点。
2. 循环链表:循环链表在单向链表的基础上,将链表的尾节点指向了头节点,形成了一个环形结构。使用循环链表实现队列时,入队操作同样是在链表尾部添加一个节点,但是出队操作是从链表头部删除一个节点,并将头节点的指针指向下一个节点。如果队列为空,头节点和尾节点指向同一个节点。
下面是使用Python实现单向链表和循环链表队列的代码示例:
单向链表队列:
```python
class Node:
def __init__(self, value=None, next=None):
self.value = value
self.next = next
class Queue:
def __init__(self):
self.head = None
self.tail = None
def is_empty(self):
return not bool(self.head)
def enqueue(self, value):
node = Node(value)
if not self.head:
self.head = node
self.tail = node
else:
self.tail.next = node
self.tail = node
def dequeue(self):
if self.is_empty():
return None
node = self.head
self.head = self.head.next
if not self.head:
self.tail = None
return node.value
```
循环链表队列:
```python
class Node:
def __init__(self, value=None, next=None):
self.value = value
self.next = next
class Queue:
def __init__(self):
self.tail = None
def is_empty(self):
return not bool(self.tail)
def enqueue(self, value):
node = Node(value)
if self.is_empty():
node.next = node
else:
node.next = self.tail.next
self.tail.next = node
self.tail = node
def dequeue(self):
if self.is_empty():
return None
node = self.tail.next
if node == self.tail:
self.tail = None
else:
self.tail.next = node.next
return node.value
```
需要注意的是,由于循环链表队列的存在,当队列为空时,头节点和尾节点指向同一个节点。