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++){
//将窗口服务时间初始化为0
for(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
}//while
System.out.println("售票窗口数量:"+i);
System.out.println("平均时间为:"+totalTime/NUM_CUSTOMER);
}//for
}
}