python全栈工程师 - 数据结构与算法》:队列
一、课程目标
队列的概念
队列的Python实现
二、详情解读
1.什么是队列:队列是一种线性表
1.队列从尾部插入、从头部弹出
2.队列的数据访问遵从FIFO(first-in first-out)协议
3.出了基本队列结构以外还有双向队列和优先队列
2.队列的Python实现
方法 | 说明 |
---|---|
q.isEmpty() | 队列是否为空 |
q.__ len __() | 队列中的项目数 |
q.put() | 在队列压入一项 |
q.get() | 如果q不为空,返回并删除第一项,否则抛出错误EmptyError |
队列的实现
链表实现队列
使用链表实现队列,从链表首部压入或尾部弹出
需要设定一个尾部标志
时间复杂度为O(1)
2.Python的内置队列(queue模块与collections.deque)
queue.Queue-FIFO队列
queue.LifoQueue-LIFO队列
queue.PriorityQueue-优先级队列
queue.deque(collections.deque)-双向队列
队列中常用的方法
方法 | 说明 |
---|---|
q.empty() | 队列是否为空 |
q.qsize() | 队列中的项目数 |
q.full() | 队列是否已满 |
q.put() | 插入数据,如果队列已满,阻塞到可以插入 |
q.get() | 如果q不为空,返回并删除第一项,否则阻塞到有数据到止 |
q.put_nowait() | 插入数据,如果队列已满,返回错误异常 |
q.get_nowait() | 获得数据,如果队列为空,返回错误异常 |
q.task_done() | 队列消费者用来指示对于项的处理已经结束 |
q.join() | 阻塞到队列中所有的项均被删除或者已处理 |
from queue import Queue
from queue import LifoQueue
from queue import deque
q=Queue()
q.put('A')
q.put('B')
q.put('C')
print('FIFO 队列',q.queue)
while not q.empty():
print(q.get())
print('*'*100)
print('FIFO 队列',q.queue)
print('-'*100)
lifo_queue=LifoQueue()
lifo_queue.put('A')
lifo_queue.put('B')
lifo_queue.put('C')
print('LIFO 队列',lifo_queue.queue)
while not lifo_queue.empty():
print(lifo_queue.get())
print('*'*100)
print('LIFO 队列',lifo_queue.queue)
print('-'*100)
deque_queue=deque(['A','B','C'])
print('双端队列',deque_queue)
deque_queue.append('F')
deque_queue.appendleft('E')
print('双端队列',deque_queue)
deque_queue.rotate(1)
print('循环右移1次后的队列',deque_queue)
deque_queue.rotate(-2)
print('循环左移2次后的队列',deque_queue)
deque_queue.popleft()
print('删除最左端元素后的队列',deque_queue)
deque_queue.pop()
print('删除最右端元素后的队列',deque_queue)
print('-'*100)