数据结构:链队列(LinkedQueue)

数据结构作业

Problem 02: Linked Queue

一、链队列

  1. 链队列题目

    请实现一个链队列(包含链队列结点类),要求具备如下功能:

    1.出入队列

    2.队列元素总数获取

    3.队列非空判断

    4.获取队列头结点

  2. 代码部分

class Node(object):
    def __init__(self, data=None, next=None):
        self.data = data
        self.next = next

class LinkedQueue(object):
    def __init__(self):
        temp_node = Node(None)
        self.front = temp_node
        self.rear = temp_node

    def LinkQueue(self, val_list):
        for val in val_list:
            self.enqueue(val)

    def is_empty(self):
        if self.front == self.rear:
            return True
        else:
            return False

    def size(self):
        prehead = self.front
        count = 0
        while prehead.next:
            count += 1
            prehead = prehead.next
        return count

    def enqueue(self, e):
        new_node = Node(e)
        if self.is_empty():
            self.front.next = new_node
        self.rear.next = new_node
        self.rear = self.rear.next

    def dequeue(self):
        if self.is_empty():
            print('队为空!')
            exit()
        else:
            temp = self.front.next
            self.front.next = temp.next
            if self.rear == temp:
                # 这个结点是尾结点
                self.front = self.rear
            return temp.data

    def get_head(self):
        return self.front.next
  1. 演示结果
    请添加图片描述

二、银行业务模拟

  1. 题目

功能:(参考学习通实验作业中的PDF文件,内含C / C++版本的实现代码)

假设银行柜台有多个窗口,为每个来到的顾客发一个号码,如果哪个窗口空闲了,就叫号码最靠前的顾客来办理业务;
如果同时几个窗口空闲,就按照一种法则来决定这几个窗口叫号的顺序。
使用队列能保证顾客按照先来后到的顺序接受服务——因为大家排在一个队里。

具体如下:

柜台服务以单位时间为间隔,直至下班。每一时刻都有一定的概率抵达一位顾客;
该顾客所办业务服务的时长随机确定,然后分配某一窗口为其服务;
(按“最短优先”的原则:在所有窗口中挑选出等待服务的顾客人数最少的窗口)
每经单位时间,各窗口最靠前的顾客(如果有的话)的待服务时长均相应减少一个单位时间;
若时长归零,则该顾客的业务已办理完毕,顾客退出窗口并由后一位顾客(如果有的话)接替。

提供了部分可供使用的接口:(直接使用,不需要导入)

LinkedQueue类的对象 q = LinkedQueue()
可用的方法:
– 1.q.enqueue(customer), 入队列
– 2.q.dequeue(), 出队列
– 3.q.is_empty(), 判断是否为空
– 4.q.size(), 获取队列当前元素个数
– 5.q.get_head(), 获得即将出队列的结点
– 6.randint(left, right), 获得区间[left, right]内的一个随机值

  1. 代码部分
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):
    """返回最合适的窗口号"""
    minSize = windows[0].size()
    optiWin = 0
    for i in range(nWin):
        if minSize > windows[i].size():
            minSize = windows[i].size()
            optiWin = i
    return optiWin

def simulate(nWin: int, servTime: int):
    res = []  # 记录下每次客户完成服务,离开的窗口号码
    windows = [LinkedQueue() for _ in range(nWin)]
    for now in range(servTime):
        if randint(0, 1 + nWin):
            c = Customer()
            c.time = 1 + randint(0, 98)
            c.window = bestWindow(windows, nWin)
            windows[c.window].enqueue(c)
            ...
        for i in range(nWin):
            if not windows[i].is_empty():
                ...
                windows[i].front().time -= 1
                if windows[i].front().time <= 0:
                    out = windows[i].dequeue()  # 客户业务完,此客户离开窗口
                    res.append(str(out))  # 将此时离开的客户记录到res数组
    return res
  1. 演示结果
    请添加图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值