java实现队列及队列的应用

来源:互联网 发布:每年车祸数据统计 编辑:程序博客网 时间:2024/04/30 16:52
package Queue;import java.util.LinkedList;public class Queue {//队列是先进先出//队尾插入数据//队头删除数据LinkedList linkList = new LinkedList();public void put(Object object){linkList.addLast(object);}public boolean isEmpty(){return linkList.isEmpty();}public Object get(){if(!linkList.isEmpty()){return linkList.removeFirst();}else{return linkList.isEmpty();}}public int getSize(){return linkList.size();}public void clear(){linkList.clear();}}




1.利用队列的保存顺序特性,模拟售票口

考虑去银行办业务:一般来说,服务窗口越多,队走的越快,银行经理希望顾客满意,但又不希望雇佣过多的员工。

我们模拟的服务窗口有如下假设:

1.只排一队,并且先到的人先得到服务(这是一个队列)

2.平均每隔15秒就会来一位顾客

3.如果有空闲的窗口,在顾客抵达之时就会马上处理

4.从顾客来到窗口到处理完顾客请求,这个平均需要120秒

以下就来模拟高峰期银行开多少个窗口最为合适:

模拟一个顾客类:


package Queue;public class Customer {private int arriveTime;private int leaveTime;public Customer(int arriveTime){this.arriveTime = arriveTime;this.leaveTime = 0;}public int getArriveTime() {return arriveTime;}public void setArriveTime(int arriveTime) {this.arriveTime = arriveTime;}public int getLeaveTime() {return leaveTime;}public void setLeaveTime(int leaveTime) {this.leaveTime = leaveTime;}public int getTotalTime(){return leaveTime-arriveTime;}}

模拟类

代码:


package Queue;public class Demo1 {//假定有100个顾客//最大窗口数为10//从顾客来到窗口到处理完顾客请求,这个平均需要120秒public static void main(String[] args) {int NUM_CUSTOMER = 100;Customer customer;int NUM_WINDOWS = 10;int[] WindowsTime = new int[NUM_WINDOWS];int departs,Process = 120;Queue queue = new Queue();for(int i=0;i<NUM_WINDOWS;i++){//将窗口服务时间初始化为0for(int j=0;j<i;j++){WindowsTime[j] = 0;}//模拟顾客每隔15分钟过来for(int j=0;j<NUM_CUSTOMER;j++){queue.put(new Customer(j*15));}int totalTime = 0;while(!queue.isEmpty()){for(int j=0;j<=i;j++){//i表示窗口编号if(!queue.isEmpty()){customer = (Customer) queue.get();if(customer.getArriveTime()>WindowsTime[j]){//有空闲,直接处理departs = customer.getArriveTime()+Process;}else{//没空闲,需等待departs = WindowsTime[j]+Process;}WindowsTime[j] = departs;customer.setLeaveTime(departs);totalTime = totalTime+customer.getTotalTime();}}//for}//whileSystem.out.println("售票窗口数量:"+i);System.out.println("平均时间为:"+totalTime/NUM_CUSTOMER);}//for}}


0 0