基本數(shù)據(jù)結構 — — 隊列

先進先出(左進右出)

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)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容