数据结构作业
Problem 02: Linked Queue
一、链队列
-
链队列题目
请实现一个链队列(包含链队列结点类),要求具备如下功能:
1.出入队列
2.队列元素总数获取
3.队列非空判断
4.获取队列头结点
-
代码部分
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
- 演示结果
二、银行业务模拟
- 题目
功能:(参考学习通实验作业中的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]
内的一个随机值
- 代码部分
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
- 演示结果