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。