1. 程式人生 > >java迴圈佇列的實現

java迴圈佇列的實現

原始碼的github地址,可以下載到本地執行

package impl;

import Interface.IQueue;

/**
 * 迴圈佇列
 * <p>
 * 注意:判空和判滿的兩種情況:
 * 情況1.另設一個標識位區別佇列是空還是滿
 * 情況2.少用一個元素空間,約定以"佇列頭指標在隊尾指標的下一位位置上" 作為佇列滿的標誌
 *
 * @param <T>
 */

public class CycQueue<T> implements IQueue {

    private Integer MAXSIZE = 6; //迴圈佇列最大長度為7  0~6
    private Object[] arr;
    private Integer front;//頭指標,若佇列不為空,指向隊頭元素
    private Integer rear; //尾指標,若佇列不為空,指向佇列尾元素的下一個位置

    public IQueue InitQueue() {
        arr = new Object[MAXSIZE];
        front = rear = 0;
        return this;
    }

    public IQueue DestroyQueue() {
        arr = null;
        rear = front = 0;
        return this;
    }

    public IQueue ClearQueue() {
        rear = front = 0;
        for (int i = 0; i < arr.length; i++) {
            arr[i] = null;
        }
        return this;
    }

    public Boolean isEmpty() {
        if (front == rear) {
            return Boolean.TRUE;
        } else {
            return Boolean.FALSE;
        }
    }

    public Integer QueueLength() {
        return (rear - front + MAXSIZE) % MAXSIZE; //求環形佇列的元素個數
    }

    public Object GetHead() {
        return arr[front];
    }

    //入隊前判滿
    public Boolean EnQueue(Object e) {
        //佇列頭指標在隊尾指標的下一位位置上  說明滿了
        if ((rear + 1) % MAXSIZE == front) {
            return Boolean.FALSE;
        }
        arr[rear] = e;
        rear = (rear + 1) % MAXSIZE;
        return Boolean.TRUE;
    }

    //出隊前判空
    public Object DeQueue() {
        if (rear == front) {
            return null;
        }
        T e = (T) arr[front];
        front = (front + 1) % MAXSIZE;
        return e;
    }


    public static void main(String[] args) {
        CycQueue<Integer> cycQueue = new CycQueue<Integer>();
        cycQueue.InitQueue();
        cycQueue.EnQueue(1);
        cycQueue.EnQueue(2);
        cycQueue.EnQueue(3);
        cycQueue.EnQueue(4);
        cycQueue.EnQueue(5);
        cycQueue.EnQueue(6);

        Integer s = cycQueue.QueueLength();
        System.out.println(cycQueue.GetHead());
        for (Integer integer = 0; integer < s; integer++) {
            System.out.println(cycQueue.DeQueue());
        }
        System.out.println(cycQueue.isEmpty());

        cycQueue.EnQueue(4);
        cycQueue.EnQueue(5);
        cycQueue.EnQueue(6);
        s = cycQueue.QueueLength();
        for (Integer integer = 0; integer < s; integer++) {
            System.out.println(cycQueue.DeQueue());
        }
        System.out.println(cycQueue.isEmpty());

    }
}

輸出結果
1
1
2
3
4
5
true
4
5
6
true

原始碼的github地址,可以下載到本地執行