java实现队列及队列的应用

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
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值