[數據結構]手動實現隊列

隊列有兩種實現方式:靜態隊列(數組)和動態隊列(鏈表)。算法

此次我就使用數組來實現靜態隊列了。值得注意的是:每每實現靜態隊列,咱們都是作成循環隊列。數組

 

package com.darrenchan;

public class MyQueue {
    public int[] arrays;
    public int front;//指向第一個有效元素
    public int rear;//指向最後一個有效元素的下一個元素(無效元素)

    public MyQueue(int[] arrays, int front, int rear) {
        this.arrays = arrays;
        this.front = front;
        this.rear = rear;
    }

    /**
     * 判斷隊列是否滿了
     * @param myQueue
     * @return
     */
    public static boolean isFull(MyQueue myQueue){
        if((myQueue.rear + 1) % myQueue.arrays.length == myQueue.front){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 判斷是否爲空
     * @param myQueue
     * @return
     */
    public static boolean isEmpty(MyQueue myQueue){
        if(myQueue.rear == myQueue.front){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 入隊
     * @param myQueue
     * @param value
     */
    public static void enQueue(MyQueue myQueue, int value){
        //不是滿的隊列才入隊
        if(!isFull(myQueue)){
            myQueue.arrays[myQueue.rear] = value;
            myQueue.rear = (myQueue.rear + 1) % myQueue.arrays.length;
        }
    }

    /**
     * 遍歷
     * @param myQueue
     */
    public static void traverse(MyQueue myQueue){
        int i = myQueue.front;
        while(i != myQueue.rear){
            System.out.print(myQueue.arrays[i] + " ");
            i = (i + 1) % myQueue.arrays.length;
        }
        System.out.println();
    }

    public static void outQueue(MyQueue myQueue){
        if(!isEmpty(myQueue)){
            int value = myQueue.arrays[myQueue.front];
            System.out.println(value);
            myQueue.front = (myQueue.front + 1) % myQueue.arrays.length;
        }
    }

    public static void main(String[] args) {
        MyQueue myQueue = new MyQueue(new int[6], 0, 0);
        System.out.println(isEmpty(myQueue));
        enQueue(myQueue, 1);
        enQueue(myQueue, 2);
        enQueue(myQueue, 3);
        enQueue(myQueue, 4);
        enQueue(myQueue, 5);
        System.out.println(isFull(myQueue));
        traverse(myQueue);
        outQueue(myQueue);
    }
}

從上面的設計咱們能夠發現:rear並不指向最後一個有效的元素,在循環隊列中這樣設計是很是方便的!由於這樣設計能夠讓咱們分得清隊頭和隊尾(否則循環隊列不斷入隊或出隊,位置是變化很快的)this

因爲咱們是循環隊列,因此frontrear值會常常變更,咱們得把frontrear的值限定在一個範圍內,否則會超出隊列的長度的。spa

有這麼一個算法:rear=(rear+1)%數組長度設計

  • 好比rear的下標是2,數組的長度是6,日後面移一位是3,那麼rear = (rear+1) % 6,結果仍是3

相關文章
相關標籤/搜索