『牛客|每日一题』循环队列

简介: 基础算法无论在研究生面试还是求职面试都是十分重要的一环,这里推荐一款算法面试神器:牛客网-面试神器;算法题只有多刷勤刷才能保持思路与手感,大家赶紧行动起来吧(温馨提示:常见的面试问答题库也很nice哦 https://www.nowcoder.com/link/pc_csdncpt_ll_sf

网络异常,图片无法展示
|


1.每日一题

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

网络异常,图片无法展示
|

2.测试案例

输入:

310

push1

push2

front

push3

push4

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.完整代码(数组实现)

importjava.util.*;

publicclassMain{

   publicstaticvoidmain(String[] args){

       Scannersca=newScanner(System.in);

       intn=sca.nextInt();

       intq=sca.nextInt();

       sca.nextLine();

       Strings;

       //注意这里不是n,而是n+1

       MyCirQueuequeue=newMyCirQueue(n+1);

       for(inti=0;i<q;++i){

           s=sca.nextLine();

           Stringstrs[]=s.split(" ");

           if(strs[0].equals("push")){

               queue.push(Integer.parseInt(strs[1]));

           }elseif(strs[0].equals("front")){

               queue.front();

           }else{

               queue.pop();

           }

       }

   }

}

classMyCirQueue{

   intmaxSize;

   intrear,front;

   int []q;

   publicMyCirQueue(intmaxSize){

       this.maxSize=maxSize;

       q=newint[maxSize];

       rear=0;

       front=0;

   }

   

   //添加元素

   publicvoidpush(intval){

       if(isFull()){

           System.out.println("full");

       }else{

           //从队尾入队

           q[rear]=val;

           //队尾下标+1

           rear=(rear+1)%maxSize;

       }

   }

   

   //输出但不移除队首元素

   publicvoidfront(){

       if(isEmpty()){

           System.out.println("empty");

       }else{

           //队首元素出列

           System.out.println(q[front]);

       }

   }

   

   //输出且移除队首元素

   publicvoidpop(){

       if(isEmpty()){

           System.out.println("empty");

       }else{

           //队首元素出列

           System.out.println(q[front]);

           //队首下标+1

           front=(front+1)%maxSize;

       }

   }

   

   //判断队列是否为空

   publicbooleanisEmpty(){

       if(rear==front){

           returntrue;

       }

       returnfalse;

   }

   

   //判断队列是否为满

   publicbooleanisFull() {

       if((rear+1)%maxSize==front){

           returntrue;

       }

       returnfalse;

   }

}

网络异常,图片无法展示
|

5.每日推荐

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

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

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

相关文章
|
1月前
|
机器学习/深度学习 Java
【剑指offer】- 求1+2+3+...+n -47/67
【剑指offer】- 求1+2+3+...+n -47/67
|
1月前
【一刷《剑指Offer》】面试题 16:反转链表
【一刷《剑指Offer》】面试题 16:反转链表
【每日一题】LeetCode——反转链表
【每日一题】LeetCode——反转链表
|
1月前
剑指Offer(第二版)11
剑指Offer(第二版)11
14 0
|
1月前
剑指Offer(第二版)04
剑指Offer(第二版)04
10 0
|
1月前
剑指Offer(第二版)05
剑指Offer(第二版)05
12 0
|
1月前
剑指Offer(第二版)10-2
剑指Offer(第二版)10-2
16 0
|
1月前
剑指Offer(第二版)06
剑指Offer(第二版)06
14 0
|
9月前
每日一题(反转链表)
每日一题(反转链表)
剑指offer 72. 求1+2+…+n
剑指offer 72. 求1+2+…+n
58 0