猫狗队列

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:58   3395   0

给你一个这样的类:

public class DogCatqQueue {
 public class Pet{
  private String type;
  public Pet(String type) {
   this.type=type;
  }
  public String getPetType() {
   return this.type;
  }
 }
 public class Dog extends Pet{

  public Dog() {
   super("dog"); 
  }
 }
 public class Cat extends Pet{
  public Cat() {
   super("cat");
  }
 }

要求:实现一种新的猫狗队列结构

1.用户可以调用add方法将cat类或者dog类的实例放入队列中;
2.用户可以调用pollAll方法,将队列中所有的实例按照队列的先后顺序依次弹出;
3.用户可以调用pollDog方法,将队列中dog类的实例按照队列的先后顺序依次弹出;
4.用户可以调用pollCat方法,将队列中cat类的实例按照队列的先后顺序依次弹出;
5.用户可以调用isEmpty方法,检查队列中是否还有dog和cat的实例;
6.用户可以调用isDogEmpty方法,检查队列中是否还有dog的实例;
7.用户可以调用isCatEmpty方法,检查队列中是否还有cat的实例。


思路:实现一个新的队列,里面包含猫队列与狗队列(可跳过直接看方法2的实现)

当添加宠物为猫时,调用猫队列的添加方法,添加宠物为狗时,同理,检查队列中有无猫//狗时,直接调用相应队列是否为空的方法。这样,1,3,4,6,7都可以实现。

然后对此新的队列进行改进,加一个计数变量,每进入一个宠物记一次数,变量为0即队列已空即可得到5方法。(或者分别查询猫狗队列是否为空也可实现5方法)

方法2的实现:

增加一个count变量,绑定在宠物本身,给宠物一个编号,记录入栈顺序。在add时,增加宠物以及他的编号。在弹出时,可分别弹出猫和狗,对比编号入栈顺序,进行相应的弹出。(类似于c++中的结构体,进队列的是int与pet组成的结构体而非pet本身)

package Queue;

import java.util.LinkedList;
import java.util.Queue;

import Queue.DogCatqQueue.CountPet;

public class DogCatqQueue {
 public static class Pet {
  private String type;

  public Pet(String type) {
   this.type = type;
  }

  public String getPetType() {
   return this.type;
  }
 }
 public static class Dog extends Pet {
  public Dog() {
   super("dog");
  }
 }
 public static class Cat extends Pet {
  public Cat() {
   super("cat");
  }
 }



//自定义一个带有编号的宠物类
 public static class CountPet {
  private Pet pet;
  private int count;

  CountPet(Pet a, int b) {
   this.pet = a;
   this.count = b;// 记录是第几个进入猫狗队列的
  }
  public Pet getPet() {
   return this.pet;
  }
  public int getCount() {
   return this.count;
  }

 }




//猫狗队列
 public static class CatDogQueue {
  Queue<CountPet> catq;
  Queue<CountPet> dogq;// 此队列之进入pet类型为dog,具体对象类型为 CountPet
  private int count;// 记录猫狗队列中宠物数量中

  CatDogQueue() {
   catq = new LinkedList<CountPet>();
   dogq = new LinkedList<CountPet>();
   count = 0;// count初始化
  }

  // 进队列的方法
  public void add(Pet pet) {
   if (pet.getPetType().equals("dog")) {
    dogq.add(new CountPet(pet, this.count++));
   } else if (pet.getPetType().equals("cat")) {
    catq.add(new CountPet(pet, this.count++));
   } else
    throw new RuntimeException("没有这样的宠物!!!");

  }


  public Pet pollall() {
   if(!dogq.isEmpty()&&!catq.isEmpty()) {
   int a=dogq.peek().getCount();
   int b=catq.peek().getCount();
   return a<b?dogq.poll().getPet():catq.poll().getPet();
  }
   else if(!dogq.isEmpty()) {
    return dogq.poll().getPet();
   }
   else if(!catq.isEmpty()) {
    return catq.poll().getPet();
   }
   else throw new RuntimeException("队列已空");
 }


  public Dog pollDog() {
   if(!dogq.isEmpty())
   {return (Dog) dogq.poll().getPet();}
   else throw new RuntimeException("狗队列已空");

  }


  public Cat pollCat() {
   if(!catq.isEmpty())
   return (Cat) catq.poll().getPet();
   else throw new RuntimeException("猫队列已空");
  }

  public boolean isEmpty() {

   return (dogq.isEmpty() && catq.isEmpty());

  }

  public boolean isDogEmpty() {
   return dogq.isEmpty();

  }

  public boolean isCatEmpty() {
   return catq.isEmpty();

  }

 }
 


//主函数

 public static void main(String []args) {
 CatDogQueue test=new CatDogQueue();
 Pet dog1=new Dog();
 Pet dog2=new Dog();
 Pet dog3=new Dog();
 Pet cat1=new Cat();
 Pet cat2=new Cat();
 Pet cat3=new Cat();

 test.add(dog1);
 test.add(dog2);
 test.add(cat1);
 test.add(cat2);
 test.add(dog3);
 test.add(cat3);
 /*while (!test.isDogEmpty()) {
  System.out.println(test.pollDog().getPetType());
 }*/
 while (!test.isEmpty()) {
  System.out.println(test.pollall().getPetType());
 }
 }
}
 
 
 
 
 
 
 

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP