一、队列
队列和我们学过的栈有相似之处,我们都知道,栈遵循先进后出的原则,只有一个口,既是入口也是出口;队列,有两个口,一个出口,一个入口,遵循先进先出的原则。
二、环形队列的实现
首先我们了解了解java中的求余运算符:%,求余数
假设以 0 1 2 3 4 5 为例:这size = 6 个数字我们知道每个数字+1就是他后面的数字,那当走到数字5的时候,没路了,我们想返回0,然后接着从0开始,怎么返回呢?
思路:0到5可以看作下标,到了5号下标,回到0号下标,很简单:(5+1)% size = 0;这就是形成了环状
图解:
我们看到,front和rear初始都为0,下标0-3,size = 4,每加入一个元素rear++,现在rear = 3
我们浪费掉front的前一个格子,目的是:区别判空和判满,也就是现在:
判满代码:
public boolean isFull() {//判断队列是否满
return (rear+1) % MaxSize == front;
}
判空代码:
public boolean isEmpty(){
return rear == front;
}
环形队列代码实现:
class CireArray{
private int MaxSize;
private int front;
private int rear;
private int[]arr;
public CireArray(int maxSize) {
MaxSize = maxSize;
arr = new int[MaxSize];
}
public boolean isFull() {//判断队列是否满
return (rear+1) % MaxSize == front;
}
public boolean isEmpty(){
return rear == front;
}
public void add(int n){//加数据
if (isFull()){
System.out.println("队列满,不能加入");
return;
}
arr[rear] = n;
rear = (rear+1)%MaxSize;
}
public int get(){//取数据
if (isEmpty()){
throw new RuntimeException("队列空,不能取数据");
}
int value = arr[front];
front = (front+1)% MaxSize;
return value;
}
public void show(){//显示队列
if (isEmpty()){
System.out.println("队列空,不能取数据");
return;
}
for (int i = 0;i<front+size();i++){
System.out.printf("arr[%d]=%d\n",i%MaxSize,arr[i%MaxSize]);
}
}
public int size(){
return (rear+MaxSize-front)%MaxSize;
}
public int head(){//显示队列头数据
if (isEmpty()){
throw new RuntimeException("队列空,不能取数据");
}
return arr[front];
}
}