力扣622—设计循环队列(中等题)(图解+思路+代码)

链接👇
循环队列

题目要求:
在这里插入图片描述

思路:
我们使用10个元素大小的数组,实际上只使用9个。
使用数组,记录队头front和队尾rear,入队:elem[rear]放入元素,rear向后移动。
出队:front向后移动即可(12345元素入队,rear指向5元素的下一个位置,出队一次,front从1元素指向2元素位置).

图解👇
在这里插入图片描述

1.设置变量

 	int front = 0;
    int rear = 0;
    int[] elem;//数组实现
    public MyCircularQueue(int k) {
        this.elem = new int[k+1];//k+1 因为浪费掉一个数组格子 10个int大小的数组,只用9个
    }

2.入队

public boolean enQueue(int value) {
        if(isFull()){//为满
            return false;
        }
        elem[rear] = value;
        rear = (rear+1) % elem.length;//队尾到队头也可以执行(rear从0下标到1下标)
        //(0+1)%5 = 1; (1+1)%5 = 2; (4+1)%5 = 0;完成了5到0的循环
        return true;
    }

3.出队

public boolean deQueue() {
        if(isEmpty()){
            return false;
        }
        front = (front+1) % elem.length;//队头从0走到1
        return true;
    }

4.返回队头和队尾元素

public int Front() {
        if(isEmpty()){
            return -1;
        }
        return elem[front];
    }
    
    public int Rear() {
        if(isEmpty()){
            return -1;
        }
        //如果队列不为空 但是rear == 0 ,如何返回rear的元素
        return ((rear == 0) ? elem[elem.length-1] : elem[rear-1]);
    }

5.判空和判满

public boolean isEmpty() {
       return rear == front;
    }
    
    public boolean isFull() {
        return (rear+1) % elem.length == front;
    }

完整代码👇

class MyCircularQueue {
    int front = 0;
    int rear = 0;
    int[] elem;//数组实现
    public MyCircularQueue(int k) {
        this.elem = new int[k+1];//k+1 因为浪费掉一个数组格子 10个int大小的数组,只用9个
    }
    
    public boolean enQueue(int value) {
        if(isFull()){//为满
            return false;
        }
        elem[rear] = value;
        rear = (rear+1) % elem.length;//队尾到队头也可以执行(rear从0下标到1下标)
        //(0+1)%5 = 1; (1+1)%5 = 2; (4+1)%5 = 0;完成了5到0的循环
        return true;
    }
    
    public boolean deQueue() {
        if(isEmpty()){
            return false;
        }
        front = (front+1) % elem.length;//队头从0走到1
        return true;
    }
    
    public int Front() {
        if(isEmpty()){
            return -1;
        }
        return elem[front];
    }
    
    public int Rear() {
        if(isEmpty()){
            return -1;
        }
        //如果队列不为空 但是rear == 0 ,如何返回rear的元素
        return ((rear == 0) ? elem[elem.length-1] : elem[rear-1]);
    }
    
    public boolean isEmpty() {
       return rear == front;
    }
    
    public boolean isFull() {
        return (rear+1) % elem.length == front;
    }
}

如果对你有帮助 一键三连!
运行结果👇

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

keild

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值