数组实现队列类
非循环队列:好理解
- 构造函数
- front:表示队首的前一个位置的下标
- rear:表示最后一个元素的下标
class Queue {
private int maxSize;
private int front;
private int rear;
private int[] arr;
public Queue(int max) {
maxSize=max;
front=-1;
rear=-1;
arr=new int[maxSize];
}
- 判断队列是否已满
如果队列已满,那么rear应该是数组最后一个元素
public boolean isFull() {
if(rear==maxSize-1)
return true;
else
return false;
}
- 判断队列是否为空
如果队列为空,那么队首元素front等于队尾元素rear
public boolean isEmpty() {
if(rear==front)
return true;
else
return false;
}
- 入队
如果队列未满,那么可以入队。入队时,只能往后排,即将队尾元素加1,并赋值
public void addQueue(int value){
if(isFull())
throw new RuntimeException("队满,不能入队");
else {
rear++;
arr[rear]=value;
}
}
- 出队
如果队列不为空,可以出队。出队时,只能出队首元素(先来后到)。所以front++,返回此元素
public int getQueue() {
if(isEmpty())
throw new RuntimeException("队空,不能出队");
front++;
return arr[front];
}
- 查看队首元素
查看队首元素时,队列的元素不发生改变(注意与出队操作区别)。front的值不变
public int headQueue() {
if(isEmpty()) {
throw new RuntimeException("队空,无队首");
}
return arr[front+1];
}
public void showQueue() {
if(isEmpty()) {
throw new RuntimeException("队空,无法显示");
}
for(int i=0;i<maxSize;i++)
System.out.println("arr["+i+"]="+arr[i]);
}
循环队列:重要,有点难理解
- 为什么有循环队列
当我们使用非循环队列时,如果我们执行了出队操作,那么便会在数组的队首位置空出一个空间。但是,使用第一个队列的结构,此空间无法再次使用。所以,我们构造循环队列。循环队列在物理结构上仍然是一个直线结构,但是我们通过对队首元素和队尾元素的1特殊处理,使其形成一个逻辑意义上的循环 - 这个链接是一个模拟循环队列的。 循环队列模拟
- 说明:循环队列有多种实现方式,我所描述的只是其中一种
- 理解
- front表示队首元素,rear表示队尾元素的下一个位置。
假设数组的容量是3,那么当最后一个元素的下标是1时,rear的位置是2;当最后一个元素的位置是2时,rear的位置是0。 - 数组中要空出一个位置。
也就是说如果数组的最大容量是max,那么队列中最多有max-1个元素.
- 为什么空出一个位置呢?
如果不空出一个位置,front==rear
既可以表示队列满,也可以表示队列空。如果空出一个位置,rear==front
只能表示队列空的时候。队列满的时候如果rear>front,那么rear=maxSize-1,front=0;如果rear<front,那么rear+1==front,以上两种情况均可以使用(rear+1)%maxSize==front
表示.
- 队列中的元素的个数
(rear-front+maxSize)%msxSize
- 每次添加元素,队尾元素rear的下标变成
(rear+1)%maxSize
- 每次出队,front的下标变成
(front+1)%maxSize
- 构造函数
front 初始化为0,rear初始化为0
public CircleQueue(int max) {
this.maxSize=max;
front=0;
rear=0;
arr=new int[max];
}
public boolean isEmpty() {
if(front==rear)
return true;
else
return false;
}
public boolean isFull() {
if((rear+1)%maxSize==front)
return true;
else
return false;
}
public void addQueue(int value) {
if(isFull()) {
throw new RuntimeException("队满");
return;
}
arr[rear]=value;
rear=(rear+1)%maxSize;
}
public int getQueue() {
if(isEmpty())
{
throw new RuntimeException("队空,不能出队");
}
int value=arr[front];
front=(front+1)%maxSize;
return value;
}
public int headQueue() {
if(isEmpty()) {
throw new RuntimeException("队空,无队首");
}
return arr[front];
}
public int getNum() {
return (rear-front+maxSize)%maxSize;
}
public void showQueue() {
for(int i=front;i<front+getNum();i++)
System.out.println("arr["+(i%maxSize)+"]="+arr[i%maxSize]);
}