队列Queue模拟排队问题


4.5 队列通用于模拟人、汽车、飞机、业务等等的流动情况。应用queue.java 程序(清单4.4)的Queue类,编写一个程序模拟超市的收款队列。可以用上机 作业4.1的display()方法,显示出顾客的几条队列。可以通过敲击一个键插入 一个新的顾客。为顾客选择在哪一个队列上。收银员为每个顾客服务的时间是 随机的(可假定为按照顾客买了多少东西而定)。一旦结完账,就从队列中删 除该顾客。为了简单起见,通过敲击键模拟时间的流逝。可能每点击一下键表示时间过去了1分钟。(当然,java有更复杂的方式来处理时间。)


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Utility {
    public static String getString() throws IOException{
        InputStreamReader in = new InputStreamReader(System.in);
        BufferedReader bf = new BufferedReader(in);
        String s = bf.readLine();
        return s;
    }
}
import java.io.IOException;


public class SuperMarket {
    //四个顾客队列
    private Queue[] queue = {null,new Queue(20),new Queue(20),new Queue(20),new Queue(20)};
    public void simulate() throws IOException{//模拟收银
        long id=0;//顾客编号
        boolean flag=true;
        while(flag){
            System.out.println("请选择事件:");
            System.out.print("0.有顾客进入某个队列。");
            System.out.print("1.有顾客离开第1个队例。");
            System.out.print("2.有顾客离开第2个队例。");
            System.out.print("3.有顾客离开第3个队例。");
            System.out.print("4.有顾客离开第4个队例。");
            System.out.println("q.表示程序退出!");

            String s = Utility.getString();
            if(s.length()==0){
                continue;
            }
            char ch = s.charAt(0);
            switch(ch){
                case '0':
                    id++;
                    insertQueue(id);
                    displayQueue();
                    break;
                case '1':
                    removeQueue(1);
                    displayQueue();
                    break;
                case '2':
                    removeQueue(2);
                    displayQueue();
                    break;
                case '3':
                    removeQueue(3);
                    displayQueue();
                    break;
                case '4':
                    removeQueue(4);
                    displayQueue();
                    break;
                case 'q':
                    flag =false;
                    System.out.println("byebye!");
                    break;
                default:
                    break;
            }
        }
    }

    private void removeQueue(int queueId){
        if(queue[queueId].size()==0){
            return;
        }
        long id = queue[queueId].remove();
        System.out.println("顾客" + id + "离开第" + queueId + "个队列!"); 
    }

    public void insertQueue(long id){
        int queueId = getMinQueueId();
        queue[queueId].insert(id);
        System.out.println("顾客" + id + "进入第" + queueId + "个队例");
    }

    private int getMinQueueId(){
        int min =1;
        for(int i=2;i<5;i++){
            if(queue[i].size()<queue[min].size()){
                min =i;
            }
        }
        return min;
    }

    public void displayQueue(){
        for(int i=1;i<5;i++){
            System.out.print("第" + i + "个");
            queue[i].display();
        }
        System.out.println();
    }

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        SuperMarket sm = new SuperMarket();
        sm.simulate();
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值