题目描述
实现一种猫狗队列的结构,要求如下:
- 用户可以调用 add 方法将 cat 或者 dog 放入队列中
- 用户可以调用 pollAll 方法将队列中的 cat 和 dog 按照进队列的先后顺序依次弹出
- 用户可以调用 pollDog 方法将队列中的 dog 按照进队列的先后顺序依次弹出
- 用户可以调用 pollCat 方法将队列中的 cat 按照进队列的先后顺序依次弹出
- 用户可以调用 isEmpty 方法检查队列中是否还有 dog 或 cat
- 用户可以调用 isDogEmpty 方法检查队列中是否还有 dog
- 用户可以调用 isCatEmpty 方法检查队列中是否还有 cat
输入描述:
第一行输入一个整数 n 表示 用户的操作总次数。
以下 n行 每行表示用户的一次操作
每行的第一个参数为一个字符串 s,若 s = “add”, 则后面接着有 “cat x”(表示猫)或者“dog x”(表示狗),其中的 x 表示猫狗的编号。
输出描述:
对于每个操作:
若为 “add”,则不需要输出。
以下仅列举几个代表操作,其它类似的操作输出同理。
若为 “pollAll”,则将队列中的 cat 和 dog 按照进队列的先后顺序依次弹出。(FIFO),格式见样例。
若为 “isEmpty”,则检查队列中是否还有 dog 或 cat, 为空则输出 “yes”, 否则输出 “no”。
示例1
输入
11
add cat 1
add dog 2
pollAll
isEmpty
add cat 5
isDogEmpty
pollCat
add dog 10
add cat 199
pollDog
pollAll
输出
cat 1
dog 2
yes
yes
cat 5
dog 10
cat 199
解法一:使用三个队列报错
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int len = Integer.parseInt(br.readLine());
CDQueue q = new CDQueue();
for(int i=0;i<len;i++){
String[] ss = br.readLine().trim().split(" ");
if(ss[0].equals("add")){
q.add(ss[1],Integer.parseInt(ss[2]));
}else if(ss[0].equals("pollAll")){
q.pollAll();
}else if(ss[0].equals("pollDog")){
q.pollDog();
}else if(ss[0].equals("pollCat")){
q.pollCat();
}else if(ss[0].equals("isEmpty")){
q.isEmpty();
}else if(ss[0].equals("isDogEmpty")){
q.isDogEmpty();
}else {
q.isCatEmpty();
}
}
}
}
class CDQueue{
Queue<Animal> allq = new LinkedList<>();
Queue<Animal> catq = new LinkedList<>();
Queue<Animal> dogq = new LinkedList<>();
public void add(String cd,int num){
Animal animal;
if(cd.equals("cat")){
animal= new Animal("cat",num);
catq.add(animal);
}else if(cd.equals("dog")){
animal = new Animal("dog",num);
dogq.add(animal);
}else{
throw new RuntimeException("没这个物种");
}
allq.add(animal);
}
public void pollAll(){
StringBuilder sb = new StringBuilder();
while(!allq.isEmpty()){
Animal animal = allq.poll();
if(animal.name.equals("cat")){
catq.poll();
}else if(animal.name.equals("dog")){
dogq.poll();
}
sb.append(animal.name).append(" ").append(animal.num);
if(!allq.isEmpty()){
sb.append("\n");
}
}
System.out.println(sb.toString());
}
public void pollDog(){
StringBuilder sb = new StringBuilder();
while(!dogq.isEmpty()){
Animal dog = dogq.poll();
sb.append(dog.name).append(" ").append(dog.num);
if(!dogq.isEmpty()){
sb.append("\n");
}
allq.remove(dog);
}
System.out.println(sb.toString());
}
public void pollCat(){
StringBuilder sb = new StringBuilder();
while(!catq.isEmpty()){
Animal cat = catq.poll();
sb.append(cat.name).append(" ").append(cat.num);
if(!catq.isEmpty()){
sb.append("\n");
}
allq.remove(cat);
}
System.out.println(sb.toString());
}
public void isEmpty(){
if(allq.isEmpty()){
System.out.println("yes");
return ;
}
System.out.println("no");
}
public void isDogEmpty(){
if(dogq.isEmpty()){
System.out.println("yes");
return ;
}
System.out.println("no");
}
public void isCatEmpty(){
if(catq.isEmpty()){
System.out.println("yes");
return;
}
System.out.println("no");
}
}
class Animal{
String name;
int num;
public Animal(String name,int num){
this.name = name;
this.num = num;
}
}
解法二:两个队列
思路: 大概思路是这样可以,
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int len = Integer.parseInt(br.readLine());
CDQueue q = new CDQueue();
for(int i=0;i<len;i++){
String[] ss = br.readLine().trim().split(" ");
if(ss[0].equals("add")){
q.add(ss[1],Integer.parseInt(ss[2]));
}else if(ss[0].equals("pollAll")){
q.pollAll();
}else if(ss[0].equals("pollDog")){
q.pollDog();
}else if(ss[0].equals("pollCat")){
q.pollCat();
}else if(ss[0].equals("isEmpty")){
q.isEmpty();
}else if(ss[0].equals("isDogEmpty")){
q.isDogEmpty();
}else {
q.isCatEmpty();
}
}
}
}
class CDQueue{
Queue<PetInQueue> catq = new LinkedList<>();
Queue<PetInQueue> dogq = new LinkedList<>();
int count = 0;
public void add(String cd,int num){
Animal animal;
PetInQueue pet;
if(cd.equals("cat")){
animal= new Animal("cat",num);
pet = new PetInQueue(animal,count++);
catq.add(pet);
}else if(cd.equals("dog")){
animal = new Animal("dog",num);
pet = new PetInQueue(animal,count++);
dogq.add(pet);
}else{
throw new RuntimeException("没这个物种");
}
}
public void pollAll(){
StringBuilder sb = new StringBuilder();
Animal animal;
PetInQueue pet;
while(!catq.isEmpty()&&!dogq.isEmpty()){
if(catq.peek().count<dogq.peek().count){
pet = catq.poll();
animal = pet.animal;
}else {
pet = dogq.poll();
animal = pet.animal;
}
sb.append(animal.name).append(" ").append(animal.num);
if(!catq.isEmpty()||!dogq.isEmpty()){
sb.append("\n");
}
}
while(!catq.isEmpty()){
pet = catq.poll();
animal = pet.animal;
sb.append(animal.name).append(" ").append(animal.num);
if(!catq.isEmpty()){
sb.append("\n");
}
}
while(!dogq.isEmpty()){
pet = dogq.poll();
animal = pet.animal;
sb.append(animal.name).append(" ").append(animal.num);
if(!dogq.isEmpty()){
sb.append("\n");
}
}
System.out.println(sb.toString());
}
public void pollDog(){
StringBuilder sb = new StringBuilder();
while(!dogq.isEmpty()){
Animal dog = dogq.poll().animal;
sb.append(dog.name).append(" ").append(dog.num);
if(!dogq.isEmpty()){
sb.append("\n");
}
}
System.out.println(sb.toString());
}
public void pollCat(){
StringBuilder sb = new StringBuilder();
while(!catq.isEmpty()){
Animal cat = catq.poll().animal;
sb.append(cat.name).append(" ").append(cat.num);
if(!catq.isEmpty()){
sb.append("\n");
}
}
System.out.println(sb.toString());
}
public void isEmpty(){
if(catq.isEmpty()&&dogq.isEmpty()){
System.out.println("yes");
return ;
}
System.out.println("no");
}
public void isDogEmpty(){
if(dogq.isEmpty()){
System.out.println("yes");
return ;
}
System.out.println("no");
}
public void isCatEmpty(){
if(catq.isEmpty()){
System.out.println("yes");
return;
}
System.out.println("no");
}
}
class Animal{
String name;
int num;
public Animal(String name,int num){
this.name = name;
this.num = num;
}
}
class PetInQueue{
Animal animal;
int count;
public PetInQueue(Animal animal,int count){
this.animal = animal;
this.count = count;
}
}