#!/usr/bin/env python
# encoding: utf-8
'''
Python程序员面试算法宝典---解题总结: 第二章 栈、队列与哈希 2.7 如何设计一个排序系统
题目:
请设计一个排队系统,能够让每个进入队伍的用户都能看到自己在队列中所处的位置和变化,队伍可能
随时有人加入和退出;当有人退出影响到用户的位置的排名时需要及时反馈到用户。
分析:
实际就是实现一个队列,队列的本质是先进先出,这一点,队列在python中的实现有两种。
一种是用数组实现,需要加入队头标记;
一种使用链表实现,需要使用尾插法(带头结点)
本题中因为用户加入和取消,侧重于修改队列的时候花费较少的时间,。
又需要获取每个用户的位置排名,这就需要知道当前总用户的个数和自己的排名。
个人倾向于用链表实现该队列。
实现:
设置一个节点数据结构为:
{data, next, rank}
关键:
1 书上解法:
1.1 使用使用python中collections.deque
deque是双端队列,在list基础上增加了移动,旋转,增删。
1.2 设定一个User类,并设置seq这个属性,
实现equals方法,比较两个对象的id是否相同(应该是队列
删除元素时需要)
当将User对象放入队列时,设置seq的序号;
当出队的时候,都需要更新seq
2 deque方法
append(value): 在最右边添加元素
appendleft(value): 最左边添加元素
extend(aList): 在最右边添加所有元素
extendleft(aList): 在最左边添加所有元素
pop():将最右边元素取出
popleft():将最左边元素取出
rotate(intValue): 旋转位置,负数为向左旋转
count(value):获取队列中值为value的元素个数
remove(value): 将队列中的元素value删除
reverse():将队列逆置
参考:
Python程序员面试算法宝典
https://blog.csdn.net/happyrocking/article/details/80058623
'''
from collections import deque
class User(object):
def __init__(self, id, name, seq=None):
self.id = id
self.name = name
self.seq = seq
def equals(self, other):
return other.id == self.id
def __str__(self):
info = "id: {id}, name: {name}, sequence: {seq}".format(
id=self.id,
name=self.name,
seq=self.seq
)
return info
class UserQueue(object):
def __init__(self):
self.queue = deque()
def enQueue(self, user):
user.seq = len(self.queue) + 1
self.queue.append(user)
def deQueue(self):
self.queue.popleft()
self.updateSeq()
# 有用户随机离开
def deQueueRemove(self, user):
self.queue.remove(user)
self.updateSeq()
def updateSeq(self):
for i, user in enumerate(self.queue):
user.seq = i + 1
def printQueue(self):
for user in self.queue:
print user
def process():
user1 = User(1, 'name_1')
user2 = User(2, 'name_2')
user3 = User(3, 'name_3')
user4 = User(4, 'name_4')
userQueue = UserQueue()
userQueue.enQueue(user1)
userQueue.enQueue(user2)
userQueue.enQueue(user3)
userQueue.enQueue(user4)
userQueue.printQueue()
userQueue.deQueue()
userQueue.deQueueRemove(user3)
print "######"
userQueue.printQueue()
if __name__ == "__main__":
process()