队列
队列使用场景
- 排队
队列基本介绍
- 队列是一个有序列表,可以使用数组或链表来实现
- 遵循先进先出的原则
数组实现队列
-
总体思路
- 队列本身是有序数列,定义变量maxSize记录队列最大容量
- 队列的输出输入分别是由前后端来处理的,因此需要定义变量front和rear来记录前后端的下标,front会随着数据的输出而变化,rear会随着数据的输入而变化。
-
添加数据方法思路
- 定义方法addQueue(value);
- 判断队列是否满
rear == maxSize-1
- 队列不满则添加元素到rear+1
-
代码实现
/**
* 用数组实现队列
*/
public class ArrayQueue {
private int maxSize; //记录队列的最大容量
private int front; //记录队列的头位置
private int rear; //记录队列的尾位置
private int[] queue; //实现队列的数组
public ArrayQueue(int maxSize){
this.maxSize = maxSize;
queue = new int[maxSize];
front = -1; //规定front指向队列头元素的前一个位置
rear = -1; //指向尾元素的实际位置
}
//判断队列是否已满
public boolean isFull(){
return rear == maxSize-1;
}
//判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
//给队列添加数据
public void addQueue(int value){
//1-判断队列是否满
if (isFull()){
System.out.println("队列已满,不能添加元素。。。");
return;
}
//2-添加元素
queue[++rear] = value;
}
//从队列取出元素
public int getQueue(){
//1-判断队列是否空
if (isEmpty()){
throw new RuntimeException("队列空,不能取元素。。。");
}
//2-取元素
return queue[++front];
}
//显示队列的所有元素
public void showQueue(){
if (isEmpty()){
throw new RuntimeException("队列空。。。");
}
for (int i = front+1; i <= rear; i++) {
System.out.printf("queue[%d]=%d\n",i,queue[i]);
}
}
}
- 该方法实现队列的问题分析和优化
- 问题:目前数组使用一次就不能用(队列中取出数据的位置不能在使用),没有达到复用的效果。
- 优化:将该数组使用算法,改进成一个环形数组,达到复用效果