python双端队列deque

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

格桑8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值