队列(Queue)&循环队列(CircleQueue)
使用数组实现队列
class ArrayQueue {
private int maxSize;
private int front;
private int rear;
private int[] arr;
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
this.front = -1; //指向第一个元素之前
this.rear = -1; //指向最后一个元素
this.arr = new int[maxSize];
}
}
几个重要的判定条件
- 判断队列为空
public boolean isEmpty(){
return rear==front;
}
- 判断队列已满
public boolean idFull(){
return rear==maxSize-1;
}
- 添加元素&取出元素
public void addQueue(int n){
if (idFull()){
System.out.println("队列已满");
return;
}
rear++;
arr[rear]=n;
}
public int outQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
front++;
return arr[front];
}
以上代码存在的问题
数组不能复用,取出元素并没有真正释放数组中元素占用的内存。
循环队列
class Circle{
private int maxSize;
private int front;
private int rear;
private int[] arr;
public Circle(int maxSize) {
this.maxSize = maxSize;
//front指向队列第一个元素
// rear指向队列最后一个元素的后一个位置
this.front = 0;
this.rear = 0;
this.arr = new int[maxSize];
}
}
几个重要的判定条件
- 判断队列为空
public boolean isEmpty(){
return rear==front;
}
- 判断队列已满
public boolean idFull(){
return (rear+1)%maxSize==front;
}
- 添加元素&取出元素
public void addQueue(int n){
if (idFull()){
System.out.println("队列已满");
return;
}
arr[rear]=n;
rear=(rear+1)%maxSize;
}
public int outQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
int val=arr[front];
front=(front+1)%maxSize;
return val;
}
- 遍历元素
public void showAll(){
if (isEmpty()){
System.out.println("队列为空");
return;
}
for (int i = front; i <front+getSize() ; i++) {
System.out.println(arr[i%maxSize]);
}
}
private int getSize(){
return (rear+maxSize-front)%maxSize;
}
Tips 重难点:理解对maxSize的取模操作。