在这一文章中,我们希望通过使用数组,创建一种先进先出,后今后出的(队列)特殊的动态数组。这种队列就像名字一样,在超市排队买单的时候,先排队的人先结账,后排队的人后结账。
而我们知道,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;
}
}