泛型动态循环队列的实现——Java

本文介绍了如何使用Java实现泛型动态循环队列,包括队列的基本功能和实现方式。通过数组存储数据,利用front和tail变量指示队头和队尾位置,当front等于tail时表示队列为空,front在tail前一格表示队列满。队列入队时tail前移,出队时front前移。
摘要由CSDN通过智能技术生成

队列的基本功能

public interface Queue<E> {
    void enqueue(E e);//元素入队
    E dequeue();//元素出队
    E getFront();//查看队头
    int getSize();//存储了多少数据
    boolean isEmpty();
}

如何实现

使用数组存储数据,front存储队头元素的下标,tail存储队尾元素下一个元素的下标,元素入队,tial前移,元素出队,front前移。

front=tail时队列为空,front在tail前一格时队列满。(浪费了tail所指的空间,目的是更容易区分空和满两种情况,这样:队列容量=数组长度-1)。

代码

public class ArrayQueue<E> implements Queue<E> {
    private E[] data;
    private int front,tail;//指向队首元素
    private int size;//指向队尾元素下一个位置,即下一个元素的位置

    public ArrayQueue(int capacity){//*泛型类构造函数类名后不加<>
        data=(E[])new Object[capacity+1];//数组长度比容量大1
        front=tail=size=0;
    }
    public ArrayQueue(){
        this(10);//
    }

    private void resize(int capacity){
        if(capacity<2) return;//最多缩容到2
        E[] newData=(E[])new Object[capacity];
        for(int i=0;i<size;i++){
            newData[i]=data[(i+front)%data.length];
            //**循环front到tail的数据,拷贝到新数组
        }
        data=newData;
        front=0;
        tail=size;
    }

    @Override
    public void enqueue(E e){
        if(size+1>this.getCapacity()){//容量不足
            resize(getCapacity()*2);//不可以使用data.length
        }
        data[tail]=e;
        tail=(tail+1)%data.length;
        size++;
    }

    @Override
    public E dequeue(){
        E ret=data[front];
        if(size!=0){
            data[front]=null;//便于垃圾回收
            front=(front+1)%data.length;
            size--;
        }
        else{
            throw new IllegalArgumentException("不能从空队列中取值");
        }
        if(size<=getCapacity()/4){
            resize(getCapacity()/2);
        }//*如果容量过大,进行缩容
        return ret;
    }

    @Override
    public E getFront(){
        if(size==0)
            throw new IllegalArgumentException("不可从空队列中取队首值");
        else
            return data[front];
    }

    public int getCapacity(){
        return  data.length-1;
    }

    @Override
    public boolean isEmpty(){
        return tail==front;
    }

    @Override
    public int getSize(){
        return size;
    }

    @Override
    public String toString(){
        StringBuilder res=new StringBuilder();
        res.append("size:"+size+" capacity"+this.getCapacity()+" front"+front+" tail"+tail+"\n");
        res.append("front[");
        for(int i=front;i!=tail;i=(i+1)%data.length){
            res.append(data[i]);
        }//循环从front到tail的数据
        res.append("]tail");
        return res.toString();
    }
}

可以看到获取从front到tail的数据有两种方法:

for(int i=0;i<size;i++){
	System.out.println(data[(front+i)%data.length]);
}
for(int i=front;i!=tail;i=(i+1)%data.length){
	System.out.println(data[i]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值