Bootstrap

循环队列的实现

题目描述

实现一个循环队列,该循环队列可利用的空间大小等于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行,每行一个字符串,表示一个操作。保证操作是题目描述中的一种。

输出描述

按对应操作要求输出。

示例

 

代码

import java.util.*;
public class Main{
    static int first = 0;//定义队列的头指针
    static int last = 0;//定义队列的尾指针
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] queue = new int[n+1];
        int m = sc.nextInt();
        String line = sc.nextLine();
        for(int i = 0;i<m;i++){
            String[] arr = sc.nextLine().split(" ");
            if(arr[0].equals("push")){
                push(queue,Integer.parseInt(arr[1]));
            }else if(arr[0].equals("pop")){
                pop(queue);
            }else if(arr[0].equals("front")){
                front(queue);
            } 
        }
    }
    public static void push(int[] queue,int num){//将num加入循环队列
        //首先需要判断队列是否为满,能否加入
        if(! isFull(queue)){
            last = (last+1)%(queue.length);
            queue[last]=num;
        }else{
            System.out.println("full");
        }
    }
    public static void pop(int[] queue){//弹出循环队列的首元素
        //首先判断队列是否为空,是否能弹出
        if(! isEmpty()){
            first=(first+1)%(queue.length);
            System.out.println(queue[first]);
        }else{
            System.out.println("empty");
        }
    }
    public static void front(int[] queue){//输出首元素,不弹出
         //首先判断队列是否为空
        if(! isEmpty()){
            System.out.println(queue[(first+1)%queue.length]);
        }else{
            System.out.println("empty");
        }
    }
    public static boolean isFull(int[] queue){//判断循环队列是否为满
        return (last+1)%(queue.length)==first;
    }
    public static boolean isEmpty(){//判断循环队列是否为空
        return first==last; //如果首尾指针重合,则表示队列为空
    }
}

;