数据模拟环形队列
-
通过front和rear控制队列的头部和尾部
-
通过数学符号 % ,以及环形思维,将数组变成了环形队列
-
原先数组
[0,1,2,3,4,5,6,7,8,9]
转变后的数据如下(底层数据不变,但思想变了,通过% 控制) -
// 1 2
// 0 3
// 9 4
// 8 5
// 7 6
package com.zsx.structure.queue;
/**
* 环形数据模拟队列
*/
public class CircleArrayQueueDemo {
public static void main(String[] args) {
//初始化队列
CircleArrayQueue circleArrayQueue = new CircleArrayQueue(10);
//队列添加数据
circleArrayQueue.addQueue(11);
circleArrayQueue.addQueue(22);
circleArrayQueue.addQueue(33);
//显示队列
circleArrayQueue.show();
//从队列中取出头部
circleArrayQueue.getQueue();
//显示队列数据
circleArrayQueue.show();
//显示头部数据而不取
System.out.println(circleArrayQueue.peek());
//显示队列数据
circleArrayQueue.show();
//从队列中取出头部
circleArrayQueue.getQueue();
//显示队列数据
circleArrayQueue.show();
}
}
class CircleArrayQueue {
/**
* 队列的容量
*/
private int maxSize;
/**
* 头部指针--头部节点所在的下标
* 初始值为0
*/
private int front;
/**
* 尾部指针--尾部节点所在的下标
* 初始值:0
*/
private int rear;
/**
* 队列-数据
*/
private int[] arr;
public CircleArrayQueue(int maxSize) {
this.maxSize = maxSize;
arr = new int[this.maxSize];
front = 0;
rear = 0;
}
/**
* 添加数据到队列
*
* @param data
*/
public void addQueue(int data) {
if (isFull()) {
throw new RuntimeException("队列满了");
}
//添加数据
arr[rear] = data;
//尾部指针后移
//有可能超过长度,所以取模,回到环的开始
rear = (rear + 1) % maxSize;
}
/**
* 获取队列的数据
*/
public int getQueue() {
if (isEmpty()) {
System.out.println("队列为空");
return 0;
}
//取出对应的值
int data = arr[front];
//头部指针后移
front = (front + 1) % maxSize;
//队列移除该数据
return data;
}
/**
* 显示头部数据
*
* @return
*/
public int peek() {
if (isEmpty()) {
System.out.println("队列为空");
return 0;
}
return arr[0];
}
/**
* 显示队列的数据
*/
public void show() {
System.out.println("=======队列数据=========");
System.out.println("最大长度为:" + this.maxSize);
if (isEmpty()) {
System.out.println("空的");
return;
}
//备份一个front
int frong_bak = front;
//front --> rear
// ① front< rear --> frong_bak=rear时候,遍历结束,打印出头到尾的值
// ② front> rear --> 已经进入环形,不停取模,直至相等
while (frong_bak % maxSize != rear) {
System.out.println(arr[frong_bak % maxSize]);
frong_bak++;
}
}
/**
* 判断队列为满
*
* @return
*/
public boolean isFull() {
// 假设maxSize=10 数组坐标 0 1 2 3 4 5 6 7 8 9
// 1 2
// 0 3
// 9 4
// 8 5
// 7 6
// 情况① rear < front
// rear =5,front=6
// 情况② rear > front
// rear =9,front=0
return (rear + 1) % maxSize == front;
}
/**
* 判断队列为空
*
* @return
*/
public boolean isEmpty() {
// rear指针到了front,说明已经队列没有值了
return rear == front;
}
}
结果: