一. 抽象数据类型Queue:
-
队列的尾:rear,首:front(FIFO)
-
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"))