java數據結構複習之循環隊列

java數據結構複習之循環隊列

package learn;

/**
 *使用的是循環隊列,這個取元素之後,隊列能夠複用。
 */
public class Queue {
    public static void main(String[] args) {
        ArrayQueue queue = new ArrayQueue(10);
        queue.addQueue(2);
        queue.addQueue(3);
        queue.addQueue(6);
        queue.show();
        System.out.println("================");
        int a=queue.getQueue();
        int b=queue.getQueue();
        System.out.println(a+b);
        queue.show();
    }
}

class ArrayQueue{
    private int max_Size;//最大容量
    private int pre;//隊列頭,這裏初始指向索引0的位置
    private int end;//隊列尾,初始值爲0,這裏指向隊列最後一個元素的後一個位置,所以預留一個元素啥也不做
    private int[] arr;

    public ArrayQueue(int max_Size) {
        this.max_Size = max_Size;
        arr=new int[max_Size];
        pre=0;
        end=0;
    }
    public boolean isFull() {
        return (end + 1) % max_Size == pre;
    }
    public boolean isEmpty(){
        return end==pre;
    }
    public void addQueue(int n){
        if(isFull()){
            System.out.println("隊列滿了!別放了");
            return;
        }
        arr[end]=n;
        end=(end+1)%max_Size;

    }
    public int getQueue(){
        if(isEmpty()){
           throw new RuntimeException("隊列爲空,取不了");
        }
        int value=arr[pre];
        pre=(pre+1)%max_Size;
        return value;
    }
    public int num(){
        return (end+max_Size-pre)%max_Size;
    }
    public void show(){
        for(int i=pre;i<num();i++){
            System.out.println(arr[i]);
        }
    }
}

註釋寫的很清楚了,別的就不說了,主要說一下爲什麼留一個空的元素位,主要是用來判斷是空還是滿的,以爲,按照邏輯,end 那裏是放入元素之後,才end++,所以說一旦放滿,因爲沒有空的元素位,此時end和pre指向的位置是相同的,不能判斷是全空還是全滿相減爲0。

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