[Data Structure and Algorithm] Queue usage and cases

Define a queue:

class Queue:
    def __init__(self) -> None:
        self.items = []
    
    def isEmpty(self):
        return self.items == []
    
    def enqueue(self, item):
        # 入队在开始
        self.items.insert(0, item)
    
    def dequeue(self):
        # 出队在最后
        return self.items.pop()
    
    def size(self):
        return len(self.items)
q = Queue()
q.isEmpty()
True
q.enqueue('dog')
q.enqueue(4)
q.size()
1
q.enqueue(8.4)

Pass the Potatoes, or Toss the Handkerchief, or Joseph's Ring

## 传土豆游戏
def hotPotato(namelist, num):
    simqueue = Queue()
    for name in namelist:
        simqueue.enqueue(name)
    
    while simqueue.size() > 1:
        # 每次第7個人出隊,問最後出隊列的是誰
        for i in range(num):
            simqueue.enqueue(simqueue.dequeue())
        simqueue.dequeue()
    return simqueue.dequeue()
namelist = ['Bill','David','Susan','Jane','Kent','Brad']
num = 7
hotPotato(namelist, num)

'Susan'
#like the print job queue mentioned above

class Printer:
    def __init__(self,ppm) -> None:
        self.pagerate = ppm
        self.currentTask = None
        self.timeRemaining = 0
    
    def tick(self):
        if self.currentTask != None:
            self.timeRemaining = self.timeRemaining - 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.getPage() * 60 / self.pagerate

import random
class Task:
    def __init__(self, time) -> None:
        self.timestamp = time
        self.pages = random.randrange(1, 21)
    
    def getStamp(self):
        return self.timestamp
    def getPages(self):
        return self.pages
    
    def waitTime(self, currenttime):
        return currenttime - self.timestamp
    
    def newPrintTask():
	    num = random.randrange(1, 181)
	    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())) 



def newPrintTask(): 
    num = random.randrange(1, 181) 
    if num == 180: 
        return True 
    else: 
        return False

Guess you like

Origin blog.csdn.net/weixin_40293999/article/details/129999232