队列是含有一组对象的容器,支持快速插入和删除的先进先出语义。插入和删除操作有时称为入队(enqueue)和出队(dequeue)。与列表或数组不同,队列通常不允许随机访问所包含的对象。
应用:
队列在算法中有广泛的应用,经常用于解决调度和并行编程问题。在树或图数据结构上进行宽度优先搜索(BFS)是一种简短而美丽的算法,其中就用到了队列。
四种方式实现
1.使用列表实现,不建议,速度很慢,仅适用少量元素
入队
出队
Python 队列 collections.deque【双向队列】
——快速和稳健的队列【相比于list实现的队列,deque实现拥有更低的时间和空间复杂度。list实现在出队(pop)和插入(insert)时的空间复杂度大约为O(n),deque在出队(pop)和入队(append)时的时间复杂度是O(1)。所以deque更有优越性 而且deque既可以表示队列 又可以表示栈 实在是太方便了】
deque
类实现了一个双端队列,支持从任一端添加和删除元素。由于deque
支持从两端添加和移除元素,因此既可用作队列也可用作栈。
Python的deque
对象以双向链表实现。这为插入和删除元素提供了出色且一致的性能,但是随机访问位于栈中间元素的性能很差。
因此,默认情况下collections.deque
是Python标准库中不错的队列型数据结构:
Python标准库中包含了四种队列,分别是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque
可见deque是标准库collections中的
这其中最好用的是deque
以下是deque的基本操作:
from collections import deque
q=deque([1,2,3,4])
#添加
q.append(5)
print(q)
#删除队头
print(q.popleft())
#删除队尾
print(q.pop())
from collections import deque
q=deque([1,2,3,4])
#添加
q.append(5)
print(q)
#支持in操作
print('支持in操作',4 in q)
#顺时针旋转
q.rotate(1)
print('顺时针旋转1位',q)
#逆时针旋转
q.rotate(-1)
print('逆时针旋转1位',q)
#index查找
print('index查找',q.index(1))
#insert插入
q.insert(2,9)
print('在index=2插入9',q)
#remove删除
q.remove(3)
print('删除值=3',q)
#反转
q.reverse()
print('反转',q)
如果不需要支持并行处理,那么collections.deque
是Python中实现FIFO队列数据结构的最佳选择。collections.deque
是非常优秀的队列实现,具备期望的性能特征,并且可以用作栈(LIFO队列)
Python 队列 queue.Queue
——为并行计算提供的锁语义
queue.Queue
在Python标准库中以同步的方式实现,提供了锁语义来支持多个并发的生产者和消费者。
queue
模块包含其他多个实现多生产者/多用户队列的类,这些队列对并行计算很有用。
from queue import Queue
q =Queue()
#添加元素
q.put('1')
q.put('2')
print(q)
#删除元素
print(q.get())
print(q.get())
print(q.empty())
栈实现
1.使用列表实现栈---耗时
python的内置数据结构list可以用来实现栈,用append()向栈顶添加元素, pop() 可以以后进先出的顺序删除元素
>>> stack = []
>>> #append() fuction to push
... #element in list
...
>>> stack.append('hello')
>>> stack.append('world')
>>> stack.append('!')
>>> print('Initial stack')
Initial stack
>>> print(stack)
['hello', 'world', '!']
>>> #pop() function to pop element
... #from stack in LIFO order
...
>>> print('\nElement poped from stack')
Element poped from stack
>>> print(stack.pop())
!
>>> print(stack.pop())
world
>>> print(stack.pop())
hello
>>> print('\nStack after all elements are poped')
Stack after all elements are poped
>>> print(stack)
[]
2.使用collections.deque实现栈
python中栈也可以用deque类实现,当我们想要在实现在容器两端更快速地进行append和pop操作时,deque比列表更合适.deque可以提供O(1)时间的append和pop操作,而列表则需要O(n)时间.
from collections import deque
stack=deque()
stack.append('jello')
stack.append('kk')
print(stack)
stack.pop()
print(stack)
3.使用queue module实现栈
Queue模块有LIFO queue,也就是栈结构.用put()和get()操作从Queue中添加和获得数据