1. 基本介绍
(1)队列是一个有序列表,可以用数组或链表来实现。
(2)遵循先入先出的原则。即:先存入队列的数据,要先取出;后存入的要后取出。
(3)示意图:(使用数组模拟队列)
1.front表示队首,rear表示队尾
2.当数据加入时,rear不断增加,front没有变化。
3.当数据取出时,front不断移动,rear没有变化。
2. 数组模拟队列
(1)模拟思路
1.队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的模拟情况如上图, 其中maxSize是该队列的最大容量。
2.因为队列的输出、输入是分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标。
3.front会随着数据输出而改变,而rear则是随着数据输入而改变。
(2)数据存入队列思路
1.将尾指针往后移:rear+1。当front == rear时,队列为空。
2.若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据。当rear == maxSize – 1时,队列为满。
(3)代码实现
//使用数组模拟队列
class ArrayQueue {
private int maxSize; //数组最大容量
private int front; //指向队列头的前一个位置
private int rear; //指向队列尾
private int[] arr; //存放数据,模拟队列
//创建队列构造器,传入数组最大容量,并给各属性赋初值
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
arr = new int[maxSize];
front = -1;
rear = -1;
}
//判断队列是否已满
public boolean isFull() {
return rear == maxSize - 1;
}
//判断队列是否为空
public boolean isEmpty() {
return rear == front;
}
//添加数据到队列
public void addQueue(int data) {
//判断队列是否已满
if (isFull()) {
System.out.println("队列已满!");
return;
}
rear++; //rear位置后移
arr[rear] = data;
}
//取出队列的数据
public int getQueue() {
//判断队列是否为空
if (isEmpty()) {
//抛出异常
throw new RuntimeException("队列为空!");
}
front++; //front位置后移
return arr[front];
}
//显示队列所有数据
public void showQueue() {
//判断队列是否为空
if (isEmpty()) {
System.out.println("队列为空!");
return;
}
//遍历队列
for(int i = 0; i < arr.length; i++) {
System.out.printf("arr[%d] = %d\n", i, arr[i]);
}
}
}
(4)问题及优化分析
1.目前的数组队列使用一次后就不能使用了,不能进行复用。
2.使用算法,改进为一个环形的队列。