数组模拟循环队列(Java)
Posted yuwenS.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组模拟循环队列(Java)相关的知识,希望对你有一定的参考价值。
通过数组模拟循环队列基于Java实现
队列是一种特殊特殊的线性表,和栈一样,队列是一种操作受到限制的线性表,队列的特殊性在于它只允许在表的前端(front)进行删除操作成为出队,而只能在表的后端(rear)进行插入操作,称为入队。进行插入操作的成为队尾,进行删除操作的称为队头。
队列的介绍
- 队列是一个有序列表,可以用数组或是链表来实现
- 遵循先入先出的原则。即:先存入队列的数据,要先取出,后存入的要后取出
实现循环队列的具体思路
- 定义两个变量front和rear,front指向对头第一个元素,front 的初始值 = 0。rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定,rear 的初始值 = 0
- 定义一个数组arr模拟队列,定义一个队列最大容量尾maxSize
- 当队列满的条件是 (rear + maxSize) % maxSize == front
- 对队列为空的条件是 rear == front
- 队列中有效的数据的个数 (rear + maxSize - front) % maxSize
- 这样就能形成一个环形队列
环形队列的具体代码实现
public class CircleArrayQueue {
private int maxSize; //表示数组的最大容量
//front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素
//front 的初始值 = 0
private int front;//队列头
//rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定.
//rear 的初始值 = 0
private int rear;//队列尾
private int[] arr;//该数据用于存放数据,模拟队列
public CircleArrayQueue(int arrMaxSize){
maxSize = arrMaxSize;
arr = new int[maxSize];
}
//判断队列是否满
public boolean isFull(){
return (rear +1 ) % maxSize == front;
}
//判断对列是否为空
public boolean isEmpty(){
return rear == front;
}
//添加数据到队列
public void addQueue(int n){
//判断队列是否满
if (isFull()){
System.out.println("d队列满");
return;
}
//直接将数据加入
arr[rear] = n;
//将rear后移,这里必须取模
rear = (rear + 1) % maxSize;
}
//获取队列数据
public int getQueue(){
//判断队列是否为空
if (isEmpty()){
//抛出异常
throw new RuntimeException("队列为空");
}
//先把front对应的值保留到一个临时变量
int value = arr[front];
//将front后移
front = (front + 1) % maxSize;
//将临时变量返回
return value;
}
//显示队列所有数据
public void showQueue(){
if (isEmpty()){
System.out.println("队列为空");
return;
}
for (int i = front; i < front + size(); i++) {
System.out.println(i % maxSize + " : "+arr[i%maxSize]);
}
}
//求出当前队列有效数据的个数
public int size(){
return (rear + maxSize -front) % maxSize;
}
//显示队列的头元素,注意不是去除数据
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
return arr[front];
}
}
测试
测试操作
public static void main(String[] args) {
//因为空出一个空间做为约定所以队列大小要比具体队列数据大1
CircleArrayQueue circleArrayQueue = new CircleArrayQueue(4);
//添加队列
circleArrayQueue.addQueue(2);
circleArrayQueue.addQueue(1);
//查看队列中所有元素
System.out.println("===========队列中的所有数据===========");
circleArrayQueue.showQueue();
//显示队列的头元素
System.out.println("对头元素为:"+circleArrayQueue.headQueue());
//队列中的有效数据
System.out.println("队列中的有效数据有:"+circleArrayQueue.size()+" 个");
//出队
System.out.println("出队的元素:"+circleArrayQueue.getQueue());
System.out.println("===========出队之后的队列所有数据===========");
circleArrayQueue.showQueue();
//入队
circleArrayQueue.addQueue(2);
System.out.println("===========再次入队后队列所有数据===========");
circleArrayQueue.showQueue();
}
测试结果
以上是关于数组模拟循环队列(Java)的主要内容,如果未能解决你的问题,请参考以下文章