队列_数据模拟环形队列

数据模拟环形队列
  • 通过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;
    }


}

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值