AB8 循环队列
描述
请你实现一个循环队列,该循环队列可利用的空间大小等于n个int型变量的大小。
操作:
push x:将x加入到循环队列尾端。若循环队列已满,输出"full"(不含引号),否则不输出任何内容。保证x为int型整数。
front:输出队首元素,队首不出队。若队列为空,输出"empty"(不含引号)。
pop:输出队首元素,且队首出队。若队列为空,输出"empty"(不含引号)。
输入描述:
第一行输入两个整数n,q (1≤n,q≤10的5次方),表示循环队列可利用的空间大小和操作次数。
接下来的q行,每行一个字符串,表示一个操作。保证操作是题目描述中的一种。
输出描述:
按对应操作要求输出。
我的实现:
CycleQueue的实现,和AB7利用链表实现队列的代码差不多。唯一不同的是增加了成员变量size,用来限定队列的长度。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String nums = scanner.nextLine();
String[] numsArr = nums.split(" ");
CycleQueue cycleQueue = new CycleQueue(Integer.parseInt(numsArr[0]));
while (scanner.hasNext()) {
String operation = scanner.nextLine();
String[] result = operation.split(" ");
if (result[0].equals("push")) {
boolean success = cycleQueue.push(Integer.parseInt(result[1]));
if (!success) {
System.out.println("full");
}
} else if (result[0].equals("front")) {
cycleQueue.front();
} else if (result[0].equals("pop")) {
cycleQueue.pop();
}
}
scanner.close();
}
}
class CycleQueue {
private int n;
private int size;
private Node first;
private Node last;
private class Node {
int item;
Node next;
}
public CycleQueue(int size) {
this.size = size;
}
public boolean push(int x) {
if (n == size) {
return false;
}
Node oldLast = last;
last = new Node();
last.item = x;
if (oldLast == null) {
first = last;
} else {
oldLast.next = last;
}
n++;
return true;
}
public void pop() {
if (first == null) {
System.out.println("empty");
return;
}
int item = first.item;
Node next = first.next;
first = next;
if (next == null) {
last = null;
}
n--;
System.out.println(item);
}
public void front() {
if (first == null) {
System.out.println("empty");
return;
}
System.out.println(first.item);
}
}