双端队列,是一种具有队列和栈的性质的数据结构
双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队
双端队列的实现
操作:
- Deque()创建一个空的双端队列
- add_front(item)从队头加入一个item元素
- add_rear(item)从队尾加入一个item元素
- remove_front()从队头删除一个item元素
- remove_rear()从队尾删除一个item元素
- is_empty()判断双端是否为空
- size()返回队列大小
# -*- coding:utf-8 -*-
class Deque(object):
"""双端队列"""
def __init__(self):
self.__list = []
def add_front(self, item):
"""往队列头部添加一个item元素"""
self.__list.insert(0, item)
def add_rear(self, item):
"""往队列尾部添加一个item元素"""
self.__list.append(item)
def pop_front(self):
"""从队列头部删除一个元素"""
return self.__list.pop(0)
def pop_rear(self):
"""从队列尾部删除一个元素"""
return self.__list.pop()
def is_empty(self):
"""判断一个队列是否为空"""
return self.__list == []
def size(self):
"""返回队列大小"""
return len(self.__list)
# 先进先出
deque=Deque()
for i in range(0,10):
deque.add_rear(i)
print(deque.size())
for j in range(0,20):
kk=deque.pop_front()
print(kk)
if deque.is_empty()==True:
break
print(deque.size())
print(deque.is_empty())
运行结果:
10
0
1
2
3
4
5
6
7
8
9
0
True
Process finished with exit code 0
Python collections 模块也实现了双端队列。
collections.deque 类(双向队列)是一个线程安全、可以快速从两端添加或者删除元素的数据类型。而且如果想要有一种数据类型来存放“最近用到的几个元素”,deque 也是一个很好的选择。这是因为在新建一个双向队列的时候,你可以指定这个队列的大小,如果这个队列满员了,还可以从反向端删除过期的元素,然后在尾端添加新的元素。
maxlen 是一个可选参数,代表这个队列可以容纳的元素的数量,而且一旦设定,这个属性就不能修改了。
队列的旋转操作 ( rotate ) 接受一个参数 n,当 n > 0 时,队列的最右边的 n 个元素会被移动到队列的左边。当 n < 0 时,最左边的 n 个元素会被移动到右边。
当试图对一个已满(len(d) == d.maxlen)的队列做尾部添加操作的时候,它头部的元素会被删除掉。
extendleft(iter) 方法会把迭代器里的元素逐个添加到双向队列的左边,因此迭代器里的元素会逆序出现在队列里。
from collections import deque
# 创建一个双端队列
q = deque()
# 入队
for each in range(0,10):
q.append(each)
print(q)
# 出队
for i in range(0,3):
# 右边出
k1=q.pop()
print(k1)
# 左边出
k2=q.popleft()
print(k2)
print(q)
dq = deque(range(10), maxlen=10)
print(dq)
dq.rotate(3)
print(dq)
dq.rotate(-4)
print(dq)
dq.appendleft(-1)
print(dq)
dq.extend([11, 22, 33])
print(dq)
dq.extendleft([10, 20, 30, 40])
print(dq)
运行结果:
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
9
0
8
1
7
2
deque([3, 4, 5, 6])
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
deque([7, 8, 9, 0, 1, 2, 3, 4, 5, 6], maxlen=10)
deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], maxlen=10)
deque([-1, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
deque([3, 4, 5, 6, 7, 8, 9, 11, 22, 33], maxlen=10)
deque([40, 30, 20, 10, 3, 4, 5, 6, 7, 8], maxlen=10)
Process finished with exit code 0