python双端队列
双端队列(double ended queue, deque),是一种具有队列和栈性质的数据结构。双端队列中的元素可以从两端删除、插入,其限定插入和删除操作在表的两段进行。双端队列可以在队列任意一端入队(插入)和出队(删除、弹出)。
例如,类似于在超市买东西,进行排队付款的情形,想付款的人,不仅可以插入队尾进行排队,也可以因有急事而和相关人员商量好直接插入到队首进行付款;付完款的人就走出了队列,相当于从付款队列中删除了,而插入队尾的人,看到有一个付款口排的人少,就从队尾跑到(队尾删除)人少的付款口进行付款了,哈哈哈,还是骚气呀。这样看来,队尾队首都是可以入队、出队的。
双端队列的操作
- Deque:双端队列的创建
- pushFront:从队首插入元素
- pushRear:从队尾插入元素
- popFront:从队首删除元素
- popRear:从队尾删除元素
- peek:访问队首元素
- isEmpty:双端队列是否为空
- size:双端队列中元素数量
python中的list是有序列表,可以用于拓展作队列用。
双端队列的代码实现
class Deque:
def __init__(self):
self.items = []
def pushFront(self, v): # 从队首插入
self.items.insert(0, v)
def pushRear(self, v): # 从队尾插入
self.items.append(v)
def popFront(self): # 从队首删除
if not self.isEmpty():
self.items.pop(0)
else:
print('DequeError: fail to popFront, the deque is empty.')
def popRear(self): # 从队尾删除
if not self.isEmpty():
self.items.pop()
else:
print('DequeError: fail to popRear, the deque is empty.')
def peek(self):
if not self.isEmpty():
return self.items[0] # 访问队首元素
else:
print('The deque is empty.')
def isEmpty(self):
return self.items == []
def size(self):
return len(self.items)
dq = Deque()
# 当成栈使用
print("当成栈使用:")
for i in range(1,5): # 队尾压入(先进),队尾弹出(后出)
dq.pushRear(i)
print('栈删除前:',dq.items)
dq.popRear()
dq.popRear()
print('栈删除后:',dq.items)
# 当成队列使用
print("当成队列使用:") # 队尾插入,队首删除
for j in range(10,60,10):
dq.pushRear(j)
print('队列删除前:',dq.items)
dq.popFront()
dq.popFront()
print('队列删除后:',dq.items)
print('队列队首元素:',dq.peek())
测试结果
当成栈使用:
栈删除前: [1, 2, 3, 4]
栈删除后: [1, 2]
当成队列使用:
队列删除前: [1, 2, 10, 20, 30, 40, 50]
队列删除后: [10, 20, 30, 40, 50]
队列队首元素: 10
python中自带的双端队列模块deque
deque模块是Python标准库collections中的一个内置模块,实现双端队列的功能,在队列的两端都可以进行插入和删除.
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque的基本操作:
- append:入队,从队列右端插入一个元素
- appendleft:入队,从队列左端插入一个元素
- extend:类似于list的extend方法,迭代处理其序列seq输入,对每个元素完成与append()相同的处理
- extendleft:迭代处理其序列seq输入,对每个元素完成与appendleft()相同的处理
- pop:出队,从队列右端删除一个元素,并返回该元素
- popleft:出队,从队列左端删除一个元素,并返回该元素
- rotate:将队列的某些元素按某一方向进行旋转
from collections import deque
# queue = deque()
n=100
queue = deque(maxlen=n) # 限制queue的最大长度为n
queue.append('one') # deque(['one'])
queue.appendleft('two') # deque(['two', 'one'])
queue.extend('three') # deque(['two', 'one', 't', 'h', 'r', 'e', 'e'])
queue.extendleft('four') # deque(['r', 'u', 'o', 'f', 'two', 'one', 't', 'h', 'r', 'e', 'e'])
queue.pop() # deque(['r', 'u', 'o', 'f', 'two', 'one', 't', 'h', 'r', 'e'])
queue.popleft() # deque(['u', 'o', 'f', 'two', 'one', 't', 'h', 'r', 'e'])
queue.rotate(2) # deque(['r', 'e', 'u', 'o', 'f', 'two', 'one', 't', 'h']) ,参数为正数n时,将右端的n个元素依次插入到左端
queue.rotate(-3) # deque(['o', 'f', 'two', 'one', 't', 'h', 'r', 'e', 'u']) ,参数为负数n时,将左端的n个元素依次插入到右端
python自带的双端队列模块,还有一些其他的功能待继续发掘
参考
博客:
https://www.cnblogs.com/OoycyoO/p/9883561.html
https://blog.csdn.net/lbj1260200629/article/details/83998596