数据结构之循环队列

循环链表

循环队列

注意点:头尾指针的做出了调整,初始全部0,而单向队列为 -1

而且数组中的有一元素被空出来,来表示队列满的情况

class CircleQueneDiy {
    //队列的最大长度
    private int maxSize;

    private int front;   //这里和单项队列做出了一个调整,将头指针指向了队列收个元素的地址

    private int rear;   //尾部的指针也调整为指向队尾元素的后一个地址,我们的队列预留出来了一个长度来判断他是否满了

    //队列,模拟队列,来存放数据的
    private int[] arr;

    //构造器
    public CircleQueneDiy(int maxSize) {
        this.maxSize = maxSize;
        arr = new int[maxSize];
        //这里不赋值,因为front 和rear都默认为 0 ,正确
    }

    //判断队列是否满
    public boolean isFull() {

        //  解释,我们预留出来一个长度来判断他是否满了,例如当长度为5的数组里面放了4个值的话
        //  rear就为4, (4+1)%5=0(front) ,而此时没有取过数据 此时,我们就判断这个循环队列 满了
        return (rear + 1) % maxSize == front;
    }

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

    //添加数据到队列
    public void add(int num) {
        //判断是否队列满了
        if (isFull()) {
            throw new RuntimeException("队列已满");
        }
        //把数据放在rear下标中
        arr[rear] = num;
        //改变rear
        rear = (rear + 1) % maxSize;

    }

    //获取数据,出队列
    public int get() {

        if (isEmpty()) {  //如果是空的,就抛异常
            throw new RuntimeException("队列中是空的,请添加数据。。。。");
        }
        //拿出队首的数据
        int value = arr[front];
        front = (front + 1) % maxSize;
        return value;

    }


    //显示队列所有的数据
    public void showQuene() {
        //如果是空的
        if (isEmpty()) {
            throw new RuntimeException("队列中是空的,请添加数据。。。。");
        }

        for (int i = front; i < front + getSize(); i++) {
            System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);
        }

    }


    //获取循环队列的有效数据
    public Integer getSize() {
        return (rear + maxSize - front)%maxSize;
    }

    //显示队列的头元素,注意不是取出数据
    public void showFirst() {
        //判空
        if (isEmpty()) {
            throw new RuntimeException("队列中是空的,请添加数据。。。。");
        }
        System.out.println(arr[front + 1]);

    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值