1. queue
队列是一个先进先出 FIFO 的数据结构,有以下方法:
- q.enque() # 入队列
- q.deque() # 出队列
- q.size()
- q.isEmpty()
在 DataStructures 目录下创建 Queue.py 文件,使用 list
构建 queue
:
class Queue:
def __init__(self):
self.items = []
def enqueue(self, item):
self.items.insert(0, item)
def dequeue(self):
return self.items.pop()
def isEmpty(self):
return self.items == []
def size(self):
return len(self.items)
if __name__ == '__main__':
q = Queue()
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
while not q.isEmpty():
print(q.dequeue())
测试结果为:
1
2
3
2. deque 的应用 —— 约瑟夫环
问题描述:约瑟夫环(Joseph ring)是一个杀人游戏,n 个人围成一圈,第一个人开始报数,后面的人轮流报数 1 到 K,报到 K 的被淘汰,直到最后剩余人数少于 K
队列实现:
from DataStructures.Queue import Queue
# n people number k
def JosephRing(n, k):
q = Queue()
for i in range(n):
q.enqueue(i + 1)
count = 0
while q.size() >= k:
count = 1 if (count + 1) == k + 1 else count + 1
number = q.dequeue()
if count == k:
print(f'Num {number} is out.')
else:
q.enqueue(number)
# survivors
survivors = []
while not q.isEmpty():
survivors.append(q.dequeue())
print(f'Survivors are {survivors}')
JosephRing(20, 3)
结果为:
Survivors are [13, 20]
结果正确 🍻
3. deque
双端队列是支持头部和尾部插入删除的队列,支持 addFront
, addRear
, removeFront
, removeRear
, size
和 isEmpty
几种操作。
下面使用列表创建 deque
类:
class Deque:
def __init__(self):
self.items = []
def addFront(self, item):
self.items.insert(0, item)
def addRear(self, item):
self.items.append(item)
def removeFront(self):
return self.items.pop(0)
def removeReat(self):
return self.items.pop()
def size(self):
return len(self.items)
def isEmpty(self):
return self.items == []
if __name__ == '__main__':
d = Deque()
d.addFront(3)
d.addFront(2)
d.addFront(1)
d.addRear(4)
d.addRear(5)
while not d.isEmpty():
print(d.removeFront())
测试结果为 1 2 3 4 5,正确 🍻
4. deque 的应用 —— 回文串
可以利用 deque
检测对称的字符串,如 ’abcdedcba‘ 和 ’did 等
方法:将字符串逐个字符从 deque 头部入队,接着头尾分别出队,比较字符是否相同
from DataStructures.Deque import Deque
def Detector(string):
d = Deque()
for letter in string:
d.addFront(letter)
while d.size() >= 2:
front = d.removeFront()
rear = d.removeReat()
if front != rear:
return False
return True
print(Detector('abcdedcba')) # True
print(Detector('abceddcba')) # False
完结 🍻