java模拟环形队列

/**
 * 使用数组模拟环形队列
 * 思路:队列的头部front指向队列的第一个位置,默认值为0
 * 队列的尾部指向了队列的最后一个位置+1(也就是数组的位置)。默认值为0,将数组的一个位置预留出来
 */
public class RingQueue {
    //数组的大小,也就是队列大小-1,减了一个预留位置,比如maxSize为4,表示数组的大小为4,但是队列的大小为3,因为预留了一个位置
    private int maxSize;
    private int front;
    private int rear;
    private int[] ringQueue;

    //初始化环形队列的方法
    public RingQueue(int maxSize) {
        this.maxSize = maxSize;
        ringQueue = new int[maxSize];

        //头部尾部默认值为0
        front = 0;
        rear = 0;
    }

    //判断队列是否满了的方法
    public boolean isFull() {
        //因为环形队列的尾部指向了队列的最后一个位置的后一个位置,当rear=3,front=0时,其实队列已经满了,但是数组有一个预留位置,所以rear+1才是满了的
        return (rear + 1) % maxSize == front;
    }

    //判断队列是否为空
    public boolean isEmpty() {
        return rear == front;
    }

    //增加一个数据
    public void addData(int data) {
        //判断是否满了
        if (isFull()) {
            throw new RuntimeException("队列满了!");
        }
        //因为环形队列的尾部指向了最后一个数据的后一个位置,所以不需要先++
        ringQueue[rear] = data;
        //尾部先++之后再除余
        rear = (rear + 1) % maxSize;
        //当尾部为0时,我们加入一个数据,不需要先++,此时的0号位置加入,然后再++,为了防止rear超过了maxSize,所以我们要取余
    }

    //取出一个数据
    public int getData() {
        //先判断是否为空
        if (isEmpty()) {
            throw new RuntimeException("队列为空!");
        }
        int temp = ringQueue[front];
        front = (front + 1) % maxSize;
        System.out.println("取出的数据为" + temp);
        return temp;
    }

    //求出当前队列的个数
    public int getCount() {
        return ((rear + maxSize - front) % maxSize);
    }

    //展示所有数据
    public void showQueue() {
        //判断是否为空
        if (isEmpty()) {
            throw new RuntimeException("队列为空!");
        }
        System.out.println("=====数据展示=====");

        //我们要从front开始遍历,一直到数据的总个数
        System.out.println("数据的个数为:" + getCount());
        for (int i = front; i < front + getCount(); i++) {
            System.out.println("========"+ringQueue[i % maxSize] + "========");
        }
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        //设置队列的大小为3,因为有一个预留位置
        RingQueue queue = new RingQueue(4);
        queue.addData(1);
        queue.addData(2);
        queue.addData(3);
        queue.getData();
        queue.getData();
        queue.addData(4);
        queue.getData();
        queue.addData(5);
        queue.showQueue();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值