python学习笔记之双端队列与环状队列
数据结构-双端队列-环状队列
双端队列
单端队列数据只能从队尾进,从队头出数据。而双端队列表示数据两端都可以进,两端都可以出。
双端队列里依然有两个指针,head
和backend
指针,一个空队列时,两个指针都指向None
,从队列的前端增加数据时,head
指针向前移动,当从队列的后端增加元素时,backend
指针向后移动元素。如果要弹出队头的元素,那先把head
往backend
方向移动,再弹出此元素,如果要弹出队尾的元素,那行把backend
指针往head
所在方向移动。当两个指针指向None
时,表示已是一个空队列。
可以用示意图来表达这一过程:
当删除元素元素时就是一个与增加元素相反的过程。
在python
的标准库中已实现了双端队列
,可以用from collections import deque
导入。deque
常用属性:
创建一个空队列:
1 | In [10]: dq = deque() |
使用append
方法向队列增加元素,此方法是向队尾增加元素:
1 | In [12]: dq.append(4) |
使用appendleft
方法向队列增加元素,此方法是向队头增加元素:
1 | In [15]: dq.appendleft(3) |
使用pop
方法弹出一个元素,此方法是在队尾方向弹出元素:
1 | In [18]: dq.pop() |
使用popleft
方法弹出一个元素,此方法是在队头方向弹出元素:
1 | In [20]: dq.popleft() |
环状队列
环状队列在初始化时会生成指定数量的槽位,如果有元素append
进来时,按照顺序依次加入到这些空的槽位中,当槽位被占满时,再append
元素时会把最老的那个元素踢掉,再把新元素放入到槽位中,依此类推,环状队列最多保存初始化时指定槽位的数据。
可以用一个简单的示意图来表示:
标准库的deque
不仅是双端队列,也是一个环状队列。只要初始化队列时加上maxlen
参数即可。
创建一个槽位为5的环境队列:
1 | In [23]: ring = deque(maxlen=5) |
向队列增加5个元素:
1 | In [25]: ring.append(1) |
当再增加一个元素时:
1 | In [31]: ring.append(6) |
第一个元素被覆盖了。