Java数据结构与算法_03_环形队列
环形队列
队列:先进先出,就像站排一样。
思路:
- 使用数组来存放数据
- 设置两个下标记分别记录队列的头和尾
- 设置一个属性记录队列的最大值
但是这样的方式是有一个问题的,我们将数据放进去之后,再将数据拿出来后那么最下面的数据是空的,也就是说这是一个一次性队列。这样显然是不对的,那么我们可以创造一个环形队列,让自己的上标(头部)到达顶部的时候就回到底部判断下面是否还有数据,如果没有数据了,那么就将新进来的数据插入到底部。
代码:
package org.example;
public class d02 {
// 数据测试
public static void main(String[] args) {
ArrayQueue arrayQueue = new ArrayQueue(3);
arrayQueue.showDate();
System.out.println("---------添加数据---------");
arrayQueue.addDate(3);
arrayQueue.showDate();
arrayQueue.addDate(8);
arrayQueue.showDate();
arrayQueue.addDate(9);
arrayQueue.showDate();
arrayQueue.addDate(81);
arrayQueue.showDate();
System.out.println("---------拿取数据---------");
Integer date = arrayQueue.getDate();
System.out.println("date = " + date);
arrayQueue.showDate();
date = arrayQueue.getDate();
System.out.println("date = " + date);
arrayQueue.showDate();
date = arrayQueue.getDate();
System.out.println("date = " + date);
arrayQueue.showDate();
date = arrayQueue.getDate();
System.out.println("date = " + date);
arrayQueue.showDate();
arrayQueue.addDate(99);
arrayQueue.showDate();
arrayQueue.addDate(81);
arrayQueue.showDate();
date = arrayQueue.getDate();
System.out.println("date = " + date);
arrayQueue.showDate();
arrayQueue.addDate(88);
arrayQueue.showDate();
arrayQueue.addDate(77);
arrayQueue.showDate();
arrayQueue.addDate(66);
arrayQueue.showDate();
arrayQueue.addDate(55);
arrayQueue.showDate();
}
// 数组模拟队列
static class ArrayQueue{
// 最大容量
private Integer maxSize;
// 下坐标
private Integer front;
// 上坐标
private Integer rear;
// 容器
private Integer[] arr;
// 构造器
public ArrayQueue(Integer maxSize) {
this.maxSize = maxSize + 1;
arr = new Integer[this.maxSize];
front = 0;
rear = 0;
}
/* 判断数组是否满了?
如果满了:
如果我们的队列没有走一圈,那么就是“(rear+1)-maxSize==front”或”(rear+1)-maxSize=0“(因为没走一圈且满了那么front一定不会动一直是0)如果走了一圈那么就是“(rear+1)=front”
两个公式中相差的就是maxSize,那么我们扣去maxSize(就是取模maxSize,就会发现,当没有走一圈的时候(rear+1)=maxSzie 取模的结果是“0”,等于满了且front没动的情况,如果走了圈那么(rear+1)是小于maxSize的,取模也就是他本身,与结果无影响,即“(rear + 1) % maxSize == front”=“(rear + 1) == front”)
*/
public boolean isFull() {
return (rear + 1) % maxSize == front;
}
// 判断数组是否为空?
public boolean isEmpty() {
return rear == front;
}
// 加入数据
public void addDate(Integer date) {
if (isFull()) {
System.out.println("队列已满");
return;
}
arr[rear] = date;
rear = (rear + 1) % maxSize;
}
// 取出数据
public Integer getDate() {
if (isEmpty()) {
return null;
}
Integer i = arr[front];
front = (front + 1) % maxSize;
return i;
}
// 展示数据
public void showDate() {
if (isEmpty()) {
System.out.println("队列为空");
return;
}
for (Integer i = front; i < front + count(); i++) {
System.out.println(arr[i % maxSize]);
}
System.out.println("------------------");
}
// 返回数据个数
public int count() {
return (rear + maxSize - front) % maxSize;
}
}
}
PS:
- 该笔记为网络课程笔记,课程地址:https://www.bilibili.com/video/BV1E4411H73v/?spm_id_from=333.337.search-card.all.click
- 如有疑问或有错误之处,欢迎讨论指正;