设计一个排队系统

来源:互联网 发布:南京二手房成交数据 编辑:程序博客网 时间:2024/04/27 22:43

缘由

这是腾讯2014校园招聘软件开发类笔试试题的附加题

题干

请设计一个排队系统,能够让每个进入队伍的用户都能看到自己在队列中所处的位置和变化,队伍可能随时有人加入和退出;当有人退出影响到用户的位置排名时需要及时反馈到用户。

我的解答

这类题属于简答题。我只写了个单机程序。下面是我对这个题思路。
首先我们需要一个容器来保存所有人,又由于随时有人加入或者退出,所以我认为用链表结果比较好(在java中就是使用LinkedList)。所以按照进入的顺序,我们对每一个进入的用户都可以返回一个在容器内的位置。有用户退出时就会调用容器类的deleteUser()方法,容器就会删除用户和更新所有人的排名。
所以整个系统有两个类,一个容器类,一个用户类。
  • 用户类:主要方法是:加入队伍,返回排名和退出队伍
  • 容器类:有一个用户的集合成员变量,加入一个用户(返回该用户的排名),打印所有用户的排名,删除用户(从容器中删除队伍,并且更新所有受影响的用户的排名)。
具体数据结构如果可以使用linkedlist的话最好,如果不能,自己设计时就要注意这个链表元素还有要记录当前在是链表元素中的第几位。如果前面的元素少了一个,那么后面的链表都排位都需要减一。


代码

实现过程中发现linkedlist完全能够满足需求,所有就使用linkedlist了。下面是类图


具体代码

import java.util.LinkedList;import java.util.List;/** * 用于装下所有排队的用户 * @author zy */public class Container {static List<Object> container = new LinkedList<Object>(); public static int addUser(User user){container.add(user);return container.size();}public static void printAllUser(){for(int i = 0 ; i < container.size() ; i ++){User user = (User)container.get(i);System.out.println(user.getName()+":"+user.getRank());}}public static boolean deleteUser(User user){boolean flag = container.remove(user);if(flag){updateQueue();}return flag;}public static void deleteFirstUser(){System.out.println("取出队头元素");container.remove(0);updateQueue();}/** * 因为删除了用户,所以我们就需要更新所有用户的排名 * 当然也可以优化一下,因为只有被删的人之后的排名需要更新,而不是所有用户 * 我这样写的原因只是更新所有用户的方法非常简单。 */private static void updateQueue() {for(int i = 0 ; i < container.size() ; i ++){User tempuser = (User)container.get(i);tempuser.setRank(i+1);}}}

/** * 模拟每一个用户 * @author dell * */public class User { private String name;private int rank;public User(String name){this.name=name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getRank() {return rank;}public void setRank(int rank) {this.rank = rank;}public void addQueue(){this.setRank(Container.addUser(this));}public void exitQueue(){if(Container.deleteUser(this)){System.out.println(this.getName()+":成功出队!");}else{System.out.println(this.getName()+":不在队列中!");}}}


main函数

/** * 腾讯2014校园招聘软件开发类笔试试题 * 附加题,第一题: * 请设计一个排队系统,能够让每个进入队伍的用户都能看到自己在队列中所处的位置和变化, * 队伍可能随时有人加入和退出;当有人退出影响到用户的位置排名时需要及时反馈到用户 *  * @author zy * */public class QueueSystem {public static void main(String[] args) {User user1 = new User("张三");user1.addQueue();User user2 = new User("李四");user2.addQueue();User user3 = new User("王五");user3.addQueue();Container.printAllUser();user2.exitQueue();user2.exitQueue();Container.printAllUser();Container.deleteFirstUser();Container.printAllUser();}}

结果

张三:1李四:2王五:3李四:成功出队!李四:不在队列中!张三:1王五:2取出队头元素王五:1

别人的解答

基于C/S架构的排队系统

对比

我觉得该做法不太好的就是:并没有说一定要从队头删除用户。那么我实现的方式就可以成功应对无论用户从何处删除的情况。

(全文完)
0 0