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。

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