Pythpn 数据结构 —— queue 和 deque

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, sizeisEmpty 几种操作。
下面使用列表创建 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


完结 🍻

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值