题目描述:
设计一个排队系统,能够让每个进入队伍的用户都能看到自己在队列中所处的位置和变化,队伍可能随时有人加入和退出,当有人退出影响到用户的位置排名时需要及时反馈到用户。
思路:
本题不仅要实现队列常见的入队列和出队列的功能,而且还需要实现队列中任意一个元素都可以随时出队列,且出队列后需要更新队伍用户位置的变化。
代码实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/1/22 8:50
# @Author : buu
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44321080
from collections import deque
class User: # 用户类
def __init__(self, id, name):
self.id = id # 某个用户的唯一标识
self.name = name # 用户的名字
self.seq = 0 # 用来标记用户在队列中的位置
def getName(self):
return self.name
def setName(self, name):
self.name = name
def getSeq(self): # 获取用户在队伍中的位置
return self.seq
def setSeq(self, seq): # 重置用户在队伍中的位置
self.seq = seq
def getId(self):
return self.id
def equals(self, arg0):
o = arg0
return self.id == o.getId()
def toStrings(self): # 打印用户的信息
return 'id: ' + str(self.id) + ', name: ' + self.name + ', seq: ' + str(self.seq)
class MyQueue: # 排队类
def __init__(self): # self即MyQueue对象,q即dequeue对象
self.q = deque() # 新建一个从左向右的 dequeue() 对象,用来模拟排队
def enQueue(self, u): # 队尾来了一个新的用户
u.setSeq(len(self.q) + 1) # 队尾用户的位置是最后一个
self.q.append(u)
def deQueue(self): # 队头离开了队列
self.q.popleft()
self.updateSeq()
def deQueueMove(self, u): # 队列中有人离开了队列
self.q.remove(u)
self.updateSeq()
def updateSeq(self): # 每次队伍变化都需要重置用户在队伍中的位置
i = 1
for u in self.q: # 对于排队中的每一个用户
u.setSeq(i) # 标记队伍中每一个用户在队伍中的位置
i += 1
def printList(self):
for u in self.q:
print(u.toStrings())
if __name__ == '__main__':
u1 = User(1, 'user1')
u2 = User(2, 'user2')
u3 = User(3, 'user3')
u4 = User(4, 'user4')
queue = MyQueue() # 模拟排队队伍,从左到右
queue.enQueue(u1)
queue.enQueue(u2)
queue.enQueue(u3)
queue.enQueue(u4) # 此时队伍: u1,u2,u3,u4
queue.deQueue() # 队首元素 u1 出队 ,此时队伍:u2,u3,u4
queue.deQueueMove(u3) # 队列中 u3 出队,此时队伍:u2,u4
queue.printList()
结果:
end