实现一个循环队列,该循环队列可利用的空间大小等于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; //如果首尾指针重合,则表示队列为空
- }
- }