队列是一个有序列表,可以使用数组或者链表来模拟,这篇博客主要采用数组模拟,链表模拟将在后面展示。
说起队列的特点,首先想到先进先出,先存入队列的数据先取出,后存入的后取出。
话不多说直接上图
根据队列的模拟图,我们可以总结出以下几点:
- 队列的最大容量MaxSize;
- 队列输入、输出,分别从前后端来处理,需要两个变量记录front、rear
- 队空条件:front=rear=-1(有的地方会从0开始,这里我们从-1开始,指向队首元素的前一个位置)
- 队满:rear=MaxSize;
public class ArrayQueueDemo {
public static void main(String[] args) {
// 初始化一个大小为3的队列
ArrayQueue queue = new ArrayQueue(3);
System.out.println("入队");
queue.addQueue(12);
queue.addQueue(8);
queue.addQueue(15);
queue.showqueue();
System.out.println("获取队首元素");
System.out.println(queue.headqueue());
System.out.println("出队");
queue.getQueue();
queue.showqueue();
}
}
// 数组模拟队列
class ArrayQueue{
private int MaxSize;
private int front; //头指针,在队列结尾
private int rear; // 尾指针,在队列之前,意味着front+1才可以取到数据
private int[] queue;
// 初始化数组
public ArrayQueue(int maxSize){
MaxSize = maxSize;
front = -1;
rear = -1;
queue = new int[MaxSize];
}
// 入队
public void addQueue(int data){
// 判断队列是否已满
if (rear == MaxSize-1){
System.out.println("队列已满,无法存数据");
return;
}
rear++;
queue[rear] = data;
}
// 出队
public int getQueue(){
// 判断元素是否为空
if (front == rear){
throw new RuntimeException("队列为空,无法取数据");
}
front++;
return queue[front];
}
// 显示队列所有数据
public void showqueue(){
for (int i = 0; i < queue.length; i++) {
System.out.printf("队列中的位置%d,对应值%d\n",i+1,queue[i]);
}
}
// 显示队列头部信息
public int headqueue(){
if (front == rear){
throw new RuntimeException("队列为空,无法获取元素");
}
return queue[front+1];
}
}