Python 双向队列Deque

首先 python的队列有很多种。Python标准库中包含了四种队列,分别是queue.Queue / asyncio.Queue /multiprocessing.Queue / collections.deque。可见deque是标准库collections中的,这其中最好用的是deque ,以下是deque的基本操作:
在这里插入图片描述
它的操作很像list。同时 相比于list实现的队列,deque实现拥有更低的时间和空间复杂度。list实现在出队(pop)和插入(insert)时的空间复杂度大约为O(n),deque在出队(pop)和入队(append)时的时间复杂度是O(1)。所以deque更有优越性 而且deque既可以表示队列又可以表示栈。

deque支持in操作符

q = collections.deque([1, 2, 3, 4])
print(5 in q)  # False
print(1 in q)  # True

# 顺时针旋转
q = collections.deque([1, 2, 3, 4])
q.rotate(1)
print(q)  # [4, 1, 2, 3]
q.rotate(1)
print(q)  # [3, 4, 1, 2]

# 逆时针旋转
q = collections.deque([1, 2, 3, 4])
q.rotate(-1)
print(q)  # [2, 3, 4, 1]
q.rotate(-1)
print(q)  # [3, 4, 1, 2]

# 还可以复制一个新队列:
>>> d.append(1)
>>> d.append(2)
>>> d
deque([1, 2])
>>> d1 = d.copy()
>>> d1
deque([1, 2])

值得注意的是 deque里边的形式是列表形式。

>>> d.clear()
>>> d.append(1)
>>> d.extend([3,4,5])
>>> d
deque([1, 3, 4, 5])
能不能从左边extend呢:

>>> d.clear()
>>> d.append(1)
>>> d.extendleft([3,4,5])
>>> d
deque([5, 4, 3, 1])


>>> d.extend(["a","b","c","d","e","f"])
>>> d
deque(['a', 'b', 'c', 'd', 'e','f'])
>>> d.index("c",0,4) #指定查找的区间
2
>>> d.index("c",0,2)
error...

题目

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。

若队列为空,pop_front 和 max_value 需要返回 -1

输入:
[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop_front”,“max_value”]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]

既然时间复杂度是O(1)

我们用deque就好

代码:

from collections import deque
class MaxQueue:

    def __init__(self):
        self.d = deque()

    def max_value(self) -> int:
        return max(self.d) if self.d else -1

    def push_back(self, value: int) -> None:
        self.d.append(value)

    def pop_front(self) -> int:
        return self.d.popleft() if self.d else -1

创建双向队列Deque序列

双向队列Deque提供了类似list的操作方法:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python3
 
import collections
#创建队列
d = collections.deque()
 
d.append("1")
d.append("2")
d.append("3")
print(len(d))
print(d[0])
print(d[-1])

执行结果:

1
2
3
3
1
3

两端都使用pop:

1
2
3
4
5
6
7
8
9
#!/usr/bin/python3
 
import collections
#创建队列
d = collections.deque("12345")
print(len(d))
print(d.popleft())
print(d.pop())
print(d)

执行结果:

1
2
3
4
5
1
5
deque(['2', '3', '4'])

我们还可以限制deque的长度:

1
d1 = collections.deque(maxlen=30)

当限制长度的deque增加超过限制数的项时, 另一边的项会自动删除:

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python3
 
import collections
 
#创建队列
d = collections.deque(maxlen=2)
d.append(1)
d.append(2)
print(d)
d.append(3)
print(d)

执行结果:

1
2
deque([1, 2], maxlen=2)
deque([2, 3], maxlen=2)

添加list中各项到deque中:

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python3
 
import collections
 
#创建队列
d = collections.deque([1,2,3,4,5])
print(d)
d.extendleft([0])
print(d)
d.extend([6,7,8])
print(d)

执行结果:

1
2
3
deque([1, 2, 3, 4, 5])
deque([0, 1, 2, 3, 4, 5])
deque([0, 1, 2, 3, 4, 5, 6, 7, 8])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值