基于python数据结构与算法(二)——队列

一. 抽象数据类型Queue:

  1. 队列的尾:rear,首:front(FIFO)
    在这里插入图片描述

  2. Python实现ADT Queue:
    在这里插入图片描述

二. 队列的应用:

1. 约瑟夫问题(击鼓传花):

在这里插入图片描述
在这里插入图片描述
代码实现:

from pythonds.basic.queue import Queue
def hotPotato(namelist, num):
	simqueue = Queue()
	for name in namelist:
		simqueue.enqueue(name)
	
	while simqueue.size() > 1 :
		for i in range (num) :
			simqueue.enqueue(simqueue.dequeue()) # 一次传递
		simqueue.dequeue()
	return simqueue.dequeue()

print(hotPotato(["Brad""Susan""David""Bill"],5))

2. 打印任务——模拟仿真:

(很重要的一个建模问题!!!!!)
在这里插入图片描述
在这里插入图片描述

这个问题关键在于建模:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
代码实现:

from pythonds.basic.queue import Queue

import random 

class Printer:
	def __init__(self,ppm):
	self.pagerate = ppm # 打印速度
	self.currentTask = None # 打印任务
	self.timeRemaining = 0 # 任务倒计时
	
	def tick(self): # 打印一秒
		if self.currentTask != None:
			self.timeRemaining = self.timeRemainiing - 1
			if self.timeRemaining <= 0:
				self.currentTask = None

	def busy(self) # 打印忙?
		if self.currentTask != None:
			return True
		else:
			return False

	def startNext(self,newtask):
		self.currentTask = newtask
		self.timeRemaining = newtask.getPages()*60/self.pagerate



class Task:
	def __init__(self,time):
		self.timestamp = time # 生成时间戳
		self.pages = random.randrange(1,21) # 打印页数

	def getStamp():
		return self.timestamp
		
	def getPages(self): 
		return self.pages

	def waitTime(self,currenttime): # 等待时间
		return currenttime-self.timestamp

def newPrintTask():
	num = random.randrange(1,181) # 1/180的概率生成作业 判断是否有作业
	if num == 180:
		return True
	else :
		return False


def simulation(numSeconds, pagesPerMinute): # 模拟
	labprinter = Printer(pagesPerMinute)
	printQueue = Queue()
	waitingtimes = []

	for currentSecond in range(numSeconds): # 时间流逝
		if newPrintTask():
			task = Task(currentSecond)
			printQueue.enqueue(task)

		if (not labprinter.busy()) and (not printQueue.isEmpty()):
			nexttask = printQueue.dequeue()
			waitingtimes.append(nexttask.waitTime(currentSecond))
			labprinter.startNext(nexttask)

		labprinter.tick()



	
	averageWait = sum(waitingtimes)/len(waitingtimes)
	print("Average Wait %6.2f secs %3d tasks remaining.",%(averageWait,printQueue.size()))



for i in range(10):
	simulation(3600,5)



在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三. 双端队列:

1. 特点:

继承了队列和栈的特点,数据项既可以从对手我加入也可以从队尾加入,也可以两端移除
在这里插入图片描述
在这里插入图片描述

四. 双端队列的应用:

1. 判定回文词:

两端同时移除字符并判定是否相同,直到deque中剩下一个或零个字符

from xxxxx import Deque

def palchecker(aString):
	chardeque.addRear(ch)

	for ch in aString :
		chardeque = addRear(ch)
	stillEqual = True

	while chardeque.size() > 1 and stillEqual:
		first = chardeque.removeFront()
		last = chardeque.removeRear()
		if first != last:
			stillEqual = False
	return stillEqual

print(palchecker("jaskvbkkcsh"))		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值