数据结构-Java-队列的实现

在这一文章中,我们希望通过使用数组,创建一种先进先出,后今后出的(队列)特殊的动态数组。这种队列就像名字一样,在超市排队买单的时候,先排队的人先结账,后排队的人后结账。
而我们知道,new一个数组的时候是需要进行长度的指定的,那么为了实现在一开始的时候不需要进行指定数组,我们有两种办法
1.在申请足够长的数组,我们就可以肆无忌惮的放置数据而无需顾虑长度;
2.每次新建增加或者减小一个长度的数组,把结果放置进去。
而实际我们既不希望一开始就申请10000个长度的数组,也不希望每一次增删都要重新折腾一遍数组,为了在时间和空间消耗之间取得一个平衡,我们可以吸取两种办法的思想,在构造的时候,new一个有一定长度的数组,同时声明一个int reallength(数组的非空长度)并初始化为0,在每次增删数据的时候,我们只需要对非空长度+1或者-1,即可记录我们需要的动态长度,而不是数组长度(arr.length),当realllength等于arr.length且需要继续添加数据的时候,我们再new一个增加了固定长度的数组,将数据放到新的数组内。
具体的实现代码如下:

public class ArrayQueue<E>{
	

	private Object[] store=new Object[10];
	private int reallength = 0;
	private int addlength = 10;
	

	public void add(E e){
		//判断数组是否满了
		if (reallength==store.length) {
			//先创建一个,是原数组长度+10的数组
			Object[] tem=new Object[store.length+addlength];
			//2.把原数组中的数据,都复制到新数组中
			for(int i=0;i<reallength;i++){
				 tem[i]=store[i];
			}
			this.store=tem;
		}
		//让动态数组的长度+1位
		reallength++;
		//将要加入的数据,存入新数组最后一位l
		store[reallength-1] = e;
	}
	
	
	public void addHead(E e){
		this.insert(0,e);
	}
	
	public Object getLast(){
		return this.delete(this.store.length-1);
	}
		
	private void insert(int index,E e){
		if (reallength>=store.length) {
			Object[] tem=new Object[store.length+addlength];
			reallength++;
			
			for(int i=0;i<index;i++){
				 tem[i]=store[i];
			}
			tem[index] = e;
			for(int i=index+1;i<reallength;i++){
				 tem[i]=store[i];
			}
			this.store=tem;
		}
		else {
			reallength++;
			for (int i = reallength-1-1;i>=index;i--) {
				store[i+1] = store[i];
			}
			store[index] = e;
		}
	}
	
	private  Object delete(int index){ 

		Object temp = store[index];
		for(int i=index+1;i<reallength;i++){
			 store[i-1]=store[i];
		}
		reallength--;
		return temp;
	}
	
	
	//从队列指定位置,取出(不同于移除)一个字符串
	private Object get(int index){
		//index>=0,小于数组最长值,不符合则需要报错
		    return this.store[index];
	}
	
	
	//队列中有多少个数据
	public int size(){
		return this.reallength;
	} 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值