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