题解 | #【模板】循环队列#

【模板】循环队列

https://www.nowcoder.com/practice/0a3a216e50004d8bb5da43ad38bcfcbf

👨‍🎓作者简介:一位喜欢写作,计科专业大二菜鸟
🏡个人主页:starry陆离

🕒首发日期:2022年8月20日星期六

🍁每日推荐:牛客网-面试神器
在这里插入图片描述
@TOC

1.每日一题

原题链接——》戳我戳我:传送法阵

image-20220819134909097

2.测试案例

输入:

3 10
push 1
push 2
front
push 3
push 4
pop
pop
pop
front
pop

输出:

1
full
1
2
3
empty
empty

3.思路分析

对于循环队列我们要考虑的问题主要是,什么时候表示队列为空,什么时候队列为满?

对于可存n个整型数据的队列

  • 如果一个下标front指示队首,下标rear指示队尾;
  • 如果front=rear时,可以保证队列是空的,例如初始状态front=rear=0;
  • 如果(rear+1)%(n+1)=front,即队列中如果再要存一个元素就只能覆盖front位置的元素了,说明此时队列为满

值得注意的细节是,对(n+1)取余,而不是对n取余。可以这么理解要判断队列满了,规定队列最多可以存n个元素,当循环队列中只剩下一个空闲存储单元时,队列就满了,这也是为什么代码中开辟的队列空间大小为(n+1)而不是n的缘由。

4.完整代码(数组实现)

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sca=new Scanner(System.in);
        int n=sca.nextInt();
        int q=sca.nextInt();
        sca.nextLine();
        String s;
        //注意这里不是n,而是n+1
        MyCirQueue queue=new MyCirQueue(n+1);
        for(int i=0;i<q;++i){
            s=sca.nextLine();
            String strs[]=s.split(" ");
            if(strs[0].equals("push")){
                queue.push(Integer.parseInt(strs[1]));
            }else if(strs[0].equals("front")){
                queue.front();
            }else{
                queue.pop();
            }
        }
    }
}
class MyCirQueue{
    int maxSize;
    int rear,front;
    int []q;
    public MyCirQueue(int maxSize){
        this.maxSize=maxSize;
        q=new int[maxSize];
        rear=0;
        front=0;
    }

    //添加元素
    public void push(int val){
        if(isFull()){
            System.out.println("full");
        }else{
            //从队尾入队
            q[rear]=val;
            //队尾下标+1
            rear=(rear+1)%maxSize;
        }
    }

    //输出但不移除队首元素
    public void front(){
        if(isEmpty()){
            System.out.println("empty");
        }else{
            //队首元素出列
            System.out.println(q[front]);
        }
    }

    //输出且移除队首元素
    public void pop(){
        if(isEmpty()){
            System.out.println("empty");
        }else{
            //队首元素出列
            System.out.println(q[front]);
            //队首下标+1
            front=(front+1)%maxSize;
        }
    }

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

    //判断队列是否为满
    public boolean isFull() {
        if((rear+1)%maxSize==front){
            return true;
        }
        return false;
    }
}

image-20220819134344732

5.每日推荐

📚订阅专栏:『牛客刷题集锦』

🍁每日推荐:基础算法无论在研究生面试还是求职面试都是十分重要的一环,这里推荐一款算法面试神器:牛客网-面试神器;算法题只有多刷勤刷才能保持思路与手感,大家赶紧行动起来吧(温馨提示:常见的面试问答题库也很nice哦)
在这里插入图片描述

如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦

#逃离互联网#
全部评论
这种模板题,牛客上有相关题库吗
点赞 回复 分享
发布于 2023-06-21 18:21 陕西
哈哈被坑了,原来是可利用元素的大小而不是队列大小
点赞 回复 分享
发布于 11-10 14:25 浙江

相关推荐

11-08 17:36
诺瓦科技_HR
点赞 评论 收藏
分享
11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
5 收藏 评论
分享
牛客网
牛客企业服务