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。