Ctrl+f搜关键词,搜不到找其他博客,下面肯定没有
队列
队列要实现的操作
Queue() 创建一个空的队列
is_empty() 判断一个队列是否为空
length()
push(item) 添加一个元素到队尾
pop() 弹出队头
peek() 获取队头
循环队列
# 队列 -- 链表实现
class Node:
def __init__(self, data, _next=None):
self.data = data # 数据域
self.next = _next # 指针域
class Queue:
def __init__(self, size):
self.head = None # 队列的队头
self.rear = None # 队列的队尾
self._length = 0 # 队列的长度
self.size = size # 队列的最大长度
def is_empty(self):
return self._length == 0
def length(self):
return self._length
def push(self, item):
# 判断队列是否已满
if self.length() == self.size:
raise ValueError('队列已满')
# 添加一个元素item到队尾
# 最后一个元素作为队尾
node = Node(item)
# 如果队列是空
if self.is_empty():
self.head = node
self.rear = node
else:
self.rear.next = node
self.rear = node
self._length += 1
def pop(self):
# 抛出队首元素
if self.is_empty():
raise ValueError('队列是空的')
value = self.head.data
self.head = self.head.next
self._length -= 1
return value
def peek(self):
if self.is_empty():
raise ValueError('队列是空的')
return self.head.data
if __name__ == '__main__':
queue = Queue(3)
queue.push(1)
queue.push(2)
queue.push(3)
print(queue.pop()) # 1
queue.push(4)
print(queue.length()) # 3
print(queue.peek()) # 2
print(queue.pop()) # 2
print(queue.pop()) # 3
print(queue.pop()) # 4
# print(queue.pop())
双端队列
Deque() 创建一个空的队列
is_empty() 判断一个队列是否为空
length()
push(item) 添加一个元素到队尾
push_left(item) 添加一个元素到队头
pop() 弹出队头
pop_right() 弹出队尾
peek() 获取队头
class Node:
def __init__(self, data, _next=None):
self.data = data # 数据域
self.next = _next # 指针域
class Deque:
def __init__(self):
self.head = None # 队首
self.rear = None # 队尾
self._length = 0 # 队列的长度
def is_empty(self):
return self._length == 0
def length(self):
return self._length
def items(self):
cur = self.head
while cur:
print(cur.data, '->', end=' ')
cur = cur.next
print()
def push(self, item):
# 在队尾添加一个元素item
node = Node(item)
# 队列为空
if self.is_empty():
self.head = node
self.rear = node
# 队列不为空
else:
self.rear.next = node
self.rear = node
self._length += 1
def push_left(self, item):
# 在队首添加一个元素item
node = Node(item)
if self.is_empty():
self.head = node
self.rear = node
else:
node.next = self.head
self.head = node
self._length += 1
def pop(self):
# 弹出队首元素
if self.is_empty():
raise ValueError('双端队列为空')
value = self.head.data
self.head = self.head.next
self._length -= 1
if self._length == 0:
self.rear = None
return value
def pop_right(self):
# 弹出队尾元素
if self.is_empty():
raise ValueError('双端队列为空')
if self.length() == 1:
return self.pop()
cur = self.head
value = self.rear.data
while cur.next != self.rear:
cur = cur.next
self.rear = cur
cur.next = None
self._length -= 1
return value
def peek(self):
if self.is_empty():
raise ValueError('双端队列为空')
return self.head.data
if __name__ == '__main__':
deque = Deque()
deque.push(1) # 1
deque.push(2) # 1, 2
deque.push_left(3) # 3, 1, 2
deque.push_left(4) # 4, 3, 1, 2
deque.items()
deque.pop()
deque.items()
deque.pop_right()
deque.items()
常用方法:
- Queue.qsize() 返回队列的大小
- Queue.empty() 如果队列为空,返回True,反之False
- Queue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应
- Queue.get([block[, timeout]])获取队列,timeout等待时间
- Queue.get_nowait() 相当于Queue.get(False),非阻塞方法
- Queue.put(item) 写入队列,timeout等待时间
- Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。
- Queue.join() 实际上意味着等到队列为空,再执行别的操作