• 循环队列的实现


    题目描述

    实现一个循环队列,该循环队列可利用的空间大小等于nn个int型变量的大小。
    操作:
    push x:将x加入到循环队列尾端。若循环队列已满,输出"full"(不含引号),否则不输出任何内容。保证x为int型整数。
    front:输出队首元素,队首不出队。若队列为空,输出"empty"(不含引号)。
    pop:输出队首元素,且队首出队。若队列为空,输出"empty"(不含引号)。

    思路

    用一个数组int[ ]来表述循环队列,first和last两个指针分别指向队列的头和尾的下一个元素;

    判断队列为空的条件:last==first;

    判断队列为满的条件:(last+1)%(queue.length)==first

    push操作:首先需要确保队列不为满,这样才能把元素加进去。只需要保证last 更新为 (last+1)%(queue.length),然后将num push进去;

    pop操作:首先确保队列不为空,这样才有效。将头指针first更新为(first+1)%(queue.length),然后输出此时first位置的元素;

    front操作:和pop操作类似,但是只输出(first+1)%(queue.length)位置的元素,而不更新first指针的位置。

    输入描述

    第一行输入两个整数 n,q (1≤n,q≤10e5),表示循环队列可利用的空间大小和操作次数。
    接下来的q行,每行一个字符串,表示一个操作。保证操作是题目描述中的一种。

    输出描述

    按对应操作要求输出。

    示例

     

    代码

    1. import java.util.*;
    2. public class Main{
    3. static int first = 0;//定义队列的头指针
    4. static int last = 0;//定义队列的尾指针
    5. public static void main(String[] args){
    6. Scanner sc = new Scanner(System.in);
    7. int n = sc.nextInt();
    8. int[] queue = new int[n+1];
    9. int m = sc.nextInt();
    10. String line = sc.nextLine();
    11. for(int i = 0;i<m;i++){
    12. String[] arr = sc.nextLine().split(" ");
    13. if(arr[0].equals("push")){
    14. push(queue,Integer.parseInt(arr[1]));
    15. }else if(arr[0].equals("pop")){
    16. pop(queue);
    17. }else if(arr[0].equals("front")){
    18. front(queue);
    19. }
    20. }
    21. }
    22. public static void push(int[] queue,int num){//将num加入循环队列
    23. //首先需要判断队列是否为满,能否加入
    24. if(! isFull(queue)){
    25. last = (last+1)%(queue.length);
    26. queue[last]=num;
    27. }else{
    28. System.out.println("full");
    29. }
    30. }
    31. public static void pop(int[] queue){//弹出循环队列的首元素
    32. //首先判断队列是否为空,是否能弹出
    33. if(! isEmpty()){
    34. first=(first+1)%(queue.length);
    35. System.out.println(queue[first]);
    36. }else{
    37. System.out.println("empty");
    38. }
    39. }
    40. public static void front(int[] queue){//输出首元素,不弹出
    41. //首先判断队列是否为空
    42. if(! isEmpty()){
    43. System.out.println(queue[(first+1)%queue.length]);
    44. }else{
    45. System.out.println("empty");
    46. }
    47. }
    48. public static boolean isFull(int[] queue){//判断循环队列是否为满
    49. return (last+1)%(queue.length)==first;
    50. }
    51. public static boolean isEmpty(){//判断循环队列是否为空
    52. return first==last; //如果首尾指针重合,则表示队列为空
    53. }
    54. }

  • 相关阅读:
    SpringBoot 整合WebService
    获取线上手机App日志
    Linux初识+环境部署
    LLM探索:为ChatGLM2的gRPC后端增加连续对话功能
    动态RDLC报表(六)
    07MCM一位评委老师的意见及MIT取得特等奖的历程描述
    requests请求douban.com获得网页源代码
    SEO优化排名的技巧与注意点(百度SEO排名的五大注意点)
    容器的通俗讲解
    java3、异常
  • 原文地址:https://blog.csdn.net/weixin_44564247/article/details/125557820