基本数据结构 — — 队列

先进先出(左进右出)

class Queue:

    # 初始化
    def __init__(self):
        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)
    
    # 打印队列
    def __repr__(self):
        return str(self.items)

【实例】约瑟夫环

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 次,并且打印的页数从 1 到 20 不等。实验室的打印机比较
老旧,每分钟只能以低质量打印 10 页。可以将打印质量调高,但是这样做会导致打印机每分钟
只能打印 5页。降低打印速度可能导致学生等待过长时间。那么,应该如何设置打印速度呢?

import random


# 模拟任务
class Task:
    def __init__(self, time):
        # 当前任务被创建的时间
        self.create_time = time
        # 打印的页数
        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):
        # 检查是否有新的打印任务产生
        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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345