Java数据结构与算法_03_环形队列

环形队列

队列:先进先出,就像站排一样。
思路:

  1. 使用数组来存放数据
  2. 设置两个下标记分别记录队列的头和尾
  3. 设置一个属性记录队列的最大值

但是这样的方式是有一个问题的,我们将数据放进去之后,再将数据拿出来后那么最下面的数据是空的,也就是说这是一个一次性队列。这样显然是不对的,那么我们可以创造一个环形队列,让自己的上标(头部)到达顶部的时候就回到底部判断下面是否还有数据,如果没有数据了,那么就将新进来的数据插入到底部。

代码:

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:

  1. 该笔记为网络课程笔记,课程地址:https://www.bilibili.com/video/BV1E4411H73v/?spm_id_from=333.337.search-card.all.click
  2. 如有疑问或有错误之处,欢迎讨论指正;
posted @ 2023-12-05 17:13  20231012  阅读(1)  评论(0编辑  收藏  举报