自定義循環隊列 (LoopQueue)

front==tail 隊列爲null
(tail+1)%capacity = front 隊列滿


/*
循環隊列
front==tail  隊列爲null
front :首位的index
tail: 隊列後的null位置

tail+1=front 或者 (tail+1) %c  = front隊列滿
 */
public class LoopQueue<E> implements Queue<E> {
    E [] data;
    int front,tail;
    int size;

    public LoopQueue() {
        this(10);
    }

    /**
     * 總容積 比真正可以保存數據的個數多1
     * @param capacity
     */
    public LoopQueue(int capacity) {
        this.data = (E[]) new Object[capacity+1];
        front=0;
        tail=0;
        size=0;
    }
    public int getCapacity(){
        return data.length-1;
    }

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

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

    //出隊(刪除首位數據)
    @Override
    public E dequeue() {
        if (isEmpty())
            throw  new IllegalArgumentException("Array is null");
        E e = data[front];
        data[front] = null;

        front= (front+1)%data.length;

        size--;
        if (size==getCapacity()/4&&getCapacity()/2!=0)
            resize(getCapacity()/2);
        return e;
    }

//    入隊
    @Override
    public void enqueue(E e) {
        //控件滿了
        if ((tail+1)% data.length==front){
            resize(getCapacity()*2);
        }

        data[tail] =e;

        tail = (tail+1)%data.length;
        size++;

    }

    private void resize(int capacity) {
        E [] newObj = (E[]) new Object[capacity+1];

        //循環隊列第一位 賦值給新數組的第一位
        for (int i = 0; i < size; i++) {
            newObj[i] = data[(i+front)%data.length];
        }
        data = newObj;
        front=0;
        tail = size;

    }

    //獲取隊首
    @Override
    public E getFront() {
        if (isEmpty()){
            throw new IllegalArgumentException("array is null");
        }
        E e = data[front];
        return e;
    }

    @NonNull
    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();

        stringBuilder.append("LoopQueue");
        stringBuilder.append("   front:[");
        for (int i = front; i !=tail; i=(i+1)%data.length) {
            stringBuilder.append(data[i]);
            //不是最後一位
            if ((i+1)%data.length!=tail) {
                stringBuilder.append(", ");
            }
        }
        stringBuilder.append("] tail");
        return stringBuilder.toString();


    }

    public static void main(String[] args) {

        LoopQueue<Integer> loopQueue = new LoopQueue<Integer>();
        for (int i = 0; i < 10; i++) {
            loopQueue.enqueue(Integer.valueOf(i));
            System.out.println(loopQueue);

            if (i%3==2){
                loopQueue.dequeue();
                System.out.println(loopQueue);
            }
        }
    }
}

結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章