一、介绍
- 队列是一个有序列表,可以用数组或是链表来实现。
- 遵循先入先出的原则。
即:先存入队列的数据,要先取出。后存入的要后取出
二、数组模拟队列
- 示意图:(使用数组模拟队列示意图)
数组模拟队列介绍:
- (1)MaxSize:队列最大数量
- (2)front:队列头指针 初始化为 -1
- (3)rear:队列尾指针 初始化为 -1
指针间的关系:
- (1) front==rear: 队列为空
- (2) rear==MaxSize-1: 队列为满
- (3) rear++:数据入列
- (4) front++:数据出列
- (5) front+1:队列头部
三、代码实现
//数组模拟队列
class ArrayQueue {
private int maxSize; //队列长度
private int rear;//队列尾部
private int fount;//队列头
private int[] arr;//存放数据
ArrayQueue(int maxSize){
this.maxSize = maxSize;
arr = new int[maxSize];
rear = -1;
fount = -1;
}
//判断是否已满
public boolean isFull(){
//当尾部和队列长度-1相等时
return rear==maxSize-1;
}
//判断是否为空
public boolean isEmpty(){
//当尾部和和头部记录想等时
return rear==fount;
}
//添加数据
public void add(int a ){
if (isFull()) {
System.out.println("队列已经满了");
return;
}
rear++;
arr[rear] = a;
}
//获取队列数据
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
fount++;
return arr[fount];
}
//获取队列所有数据
public void showQueue(){
if (isEmpty()){
System.out.println("队列为空");
return;
}
for (int a = fount+1; a<=rear;a++){
System.out.println(arr[a]);
}
}
public void showHead(){
if (isEmpty()){
System.out.println("队列为空");
return;
}
System.out.println(arr[fount+1]);
}
}
四、环形队列
通过上述代码我们可以看到数组模拟队列的增删,但是这样只是一次性的,怎么样才能充分的利用空间呢?
- 环形队列
同样我们用数组进行一个模拟环形队列,将数组看做是一个环形的(通过取模的方式来实现即可)
同样的图形我们对它的重新定义一下
数组模拟环形队列介绍:
- (1)MaxSize:队列最大数量
- (2)front:队列头指针 初始化为 0 指向队列第一个元素
- (3)rear:队列尾指针 初始化为 0 指向队列最后一个元素的后一个位置(需要空出一个空间作为约定)
指针间的关系:
- (1) front==rear: 队列为空
- (2) (rear + 1) % maxSize == front : 队列为满
- (3) (rear+1)%maxSize:数据入列
- (4) (fount+1)%maxSize;:数据出列
代码示例:
class CircleArrayQueue{
private int maxSize; //队列长度
private int rear;//队列尾部
private int fount;//队列头
private int[] arr;//存放数据
CircleArrayQueue(int arrmaxSize){
this.maxSize = arrmaxSize+1;
arr = new int[maxSize];
}
//判断是否已满
public boolean isFull(){
return (rear+1)%maxSize==fount;
}
//判断是否为空
public boolean isEmpty(){
//当尾部和和头部记录想等时
return rear==fount;
}
//添加数据
public void add(int a ){
if (isFull()) {
System.out.println("队列已经满了");
return;
}
arr[rear] = a;
rear=(rear+1)%maxSize;
}
//获取队列数据
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
int value = arr[fount];
fount=(fount+1)%maxSize;
return value;
}
//获取队列所有数据
public void showQueue(){
if (isEmpty()){
System.out.println("队列为空");
return;
}
for (int a = fount; a<fount+Size();a++){
System.out.println("arr["+a%maxSize+"] = "+arr[a%maxSize]);
}
}
public int Size(){
return (rear+maxSize-fount)%maxSize;
}
public void showHead(){
if (isEmpty()){
System.out.println("队列为空");
return;
}
System.out.println(arr[fount]);
}
}