栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python队列的基本操作_数据结构银行排队系统ppt?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python队列的基本操作_数据结构银行排队系统ppt?

使用python数据结构中的队列来实现银行排队问题,其问题描述如下:

    银行有n个窗口,总服务时间为ServTime(这两者也是所需输入的参数);

    每时刻都有一定概率会到达一名顾客,且顾客的所需服务时间随机生成——本文假设顾客所需服务时间范围为[1,20);

    顾客会选择目前等待时间总和最短的队列进行排入。

    每过一个时刻,(若该队列不为空)则队头的顾客所需服务时间-1。当其时间为0时,出队。

【给大家po个视频讲解:银行排队问题之代码讲解】

设计思路:

该问题的设计思路如下图所示:
(1)遍历整个ServTime,对每个时刻来说,首先判断此刻是否有顾客到来。
(2)若此刻没有顾客来,那么无需安排顾客排队。若此刻有顾客来,那么查看每个窗口是否有空队列。若有空队列,则让顾客加入;若无,则查看哪个窗口的等待总时间最短,并安排顾客在此队列入队。
(3)最后,每个队队头的顾客的服务时间都要-1。若有顾客的时间变为0,则让其出队。

代码实现:
import random

#队列实现
class Queue(object):
    """队列"""
    def __init__(self):
        self.items = []

    def is_empty(self):
        return self.items == []

    def enqueue(self, item):
        """进队列"""
        self.items.append(item)

    def dequeue(self):
        """出队列"""
        return self.items.pop(0)

    def size(self):
        """返回大小"""
        return len(self.items)

    def get_head(self):
        if self.is_empty():
            return False
        else:
            return self.items[0]

    def travle(self):
        return self.items

class Customer:
    def __init__(self, w=-1, t=-1):
        self.window = w #顾客应当排在第几窗口
        self.time = t #顾客所需要的服务时间

    def __str__(self):
        return f"leave from window: {self.window}"

# 找出目前等待总时间最短的窗口号码
def bestWindow(windows, nWin):
    """返回最合适的窗口号"""
    min_sum = 10000000000
    min_win = 10000000000
    for i in range(nWin):
        if windows[i].is_empty():
            return i
        else:
            list = [j.time for j in windows[i].travle()]
            sum = 0
            for k in list:
                sum = sum + k
        if sum < min_sum:
            min_sum = sum
            min_win = i
    return min_win

#模拟函数
def simulate(nWin: int, servTime: int):
    windows = [Queue() for _ in range(nWin)]  # 生成一个有n个链队列的列表,即每个链队列都是每个窗口的队列
    for now in range(servTime):  # 遍历每一个时刻
        print("现在是第",now,"时刻")
        if random.randint(0,1):
            print("有顾客来了!")
            bsetWin = bestWindow(windows,nWin)
            a = random.randint(1, 20) #这里假设顾客的所需服务时间为[1,20)
            customer = Customer(bsetWin,a)
            windows[bsetWin].enqueue(customer)
            print("TA的窗口是%s,TA所需服务时间是%s"%(bsetWin,a))
            print("第%s个客人到第%s个窗口排队中..."%(now,bsetWin))
        else:
            print("此刻没有客人来!")
        for i in range(nWin):
            if not windows[i].is_empty():
                if windows[i].get_head().time == 0:
                    windows[i].dequeue()
                    print("第%s个窗口的客人已经离开" % (i))
                else:
                    windows[i].get_head().time = windows[i].get_head().time-1

        for i in range(nWin):
            list = []
            for j in windows[i].travle():
                list.append(j.time)
            print("第%s个窗口的目前排队状态:%s"%(i,list))
        print("————————————————第%s时刻结束————————————————"%(now))
结果展示:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/783716.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号