先進先出(左進右出)
class Queue:
# 初始化
def __init__(self):
self.items = []
# 檢查隊列是否為空
def isEmpty(self):
return self.items == []
# 往隊列添加元素
# 先添加的在隊列頭部,后添加的在隊列尾部
# (相當于在列表左端添加元素,之前的數(shù)據(jù)往右移)
def enqueue(self, item):
self.items.insert(0, item)
# 刪除隊列頭部的元素(相當于刪除列表右端的數(shù)據(jù))
def dequeue(self):
return self.items.pop()
# 查看隊列的元素個數(shù)
def size(self):
return len(self.items)
# 打印隊列
def __repr__(self):
return str(self.items)
【實例】約瑟夫環(huán)
q = Queue()
def yuesefu(list_, num):
# 遍歷列表,把列表中的元素都添加到隊列中
for name in list_:
q.enqueue(name)
# 當隊列中的元素大于1時
while q.size() > 1:
print(q)
for i in range(num - 1):
q.enqueue(q.dequeue())
print(q)
print(f'本次淘汰的是:{q.dequeue()}')
return f'最后剩下的人是:{q.dequeue()}'
list_ = ['a', 'b', 'c', 'd', 'e', 'f']
num = 7
result = yuesefu(list_, num)
print(result)
【實例】打印任務
考慮計算機科學實驗室里的這樣一個場景:在任何給定的一小時內,實驗室里都有約 10 個
學生。他們在這一小時內最多打印 2 次,并且打印的頁數(shù)從 1 到 20 不等。實驗室的打印機比較
老舊,每分鐘只能以低質量打印 10 頁??梢詫⒋蛴≠|量調高,但是這樣做會導致打印機每分鐘
只能打印 5頁。降低打印速度可能導致學生等待過長時間。那么,應該如何設置打印速度呢?
import random
# 模擬任務
class Task:
def __init__(self, time):
# 當前任務被創(chuàng)建的時間
self.create_time = time
# 打印的頁數(shù)
self.pages_to_print = random.randrange(1, 21)
# currentTime:當前任務開始被服務的時間
# waitTime()返回的是當前任務在隊列里等待了多久
def waitTime(self, currentTime):
return currentTime - self.create_time
# 模擬打印機
class Printer:
# 打印機每分鐘能打印pagePerMinute頁
def __init__(self, pagePerMinute):
self.pagePerMinute = pagePerMinute
self.task = None
self.timeRemaining = 0 # 當前服務的任務還需多少時間才能完成
def getTask(self, newTask):
self.task = newTask
self.timeRemaining = (newTask.pages_to_print / self.pagePerMinute) * 60
def tick(self):
if self.task != None:
self.timeRemaining -= 1
if self.timeRemaining <= 0:
self.task = None
def isBusy(self):
if self.task == None:
return False
else:
return True
# numSeconds:模擬的時間
# pagesPerMin:模擬每秒打印多少頁
def simulation(numSeconds, pagesPerMin):
printer = Printer(pagesPerMin)
queue = Queue()
waitTimeList = []
# 遍歷一遍當作過了一秒
for currendSecond in range(numSeconds):
# 檢查是否有新的打印任務產(chǎn)生
num = random.randrange(1, 181)
if num == 180:
newTask = Task(currendSecond)
queue.enqueue(newTask)
# 判斷打印機是否空閑
if not printer.isBusy() and not queue.isEmpty():
# 從隊列里取出一個新任務給打印機
nextTask = queue.dequeue()
printer.getTask(nextTask)
# 將該任務的等待時間加入到列表里
waitTime = currendSecond - nextTask.create_time
waitTimeList.append(waitTime)
printer.tick()
avgWaitTime = sum(waitTimeList) / len(waitTimeList)
print(f'平均等待時間為:{avgWaitTime}秒,任務隊列中剩余{queue.size()}個任務未完成。')
for i in range(10):
simulation(3600, 5)