栈和队列(4)--猫狗队列

    xiaoxiao2023-03-24  5

    宠物、狗和猫的类如下: 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(String type) { super("cat"); } }

    实现一种猫狗队列的结构,要求如下:

    用户可以调用add方法将cat类或者dog类的实例放入队列中;用户可以调用pollAll方法,将队列中所有的实例按照队列的先后顺序依次弹出;用户可以调用pollDog方法,将队列中dog类的实例按照队列的先后顺序依次弹出;用户可以调用pollCat方法,将队列中cat类的实例按照队列的先后顺序依次弹出;用户可以调用isEmpty方法,检查队列中是否还有dog和cat的实例;用户可以调用isDogEmpty方法,检查队列中是否还有do的实例;用户可以调用isCatEmpty方法,检查队列中是否还有cat的实例。 误区: cat队列只放cat实例,dog队列只放dog实例,再用一个总队列放所有的实例。 原因--cat、dog以及总队列的更新问题。 用哈希表,key表示一个cat实例或者dog实例,value表示这个实例进队列序的次序。 原因--不能支持一个实例多次进队列的功能需求,因为哈希表的key只能对应一个value的值。 思考: 将不同的实例盖上时间戳,在加入实例时,盖上时间戳,生成PetEnterQueue类的实例,然后放入dogQ或者cat!Q。 只想弹出dog类的实例时,从dogQ里不断弹出就行。想俺诗经顺序弹出实例时,比较这两个队列头的时间戳,谁早弹谁。 实现代码: package algorithm_4; public class Pet { private String type; public Pet(String type) { this.type = type; } public String getPetType(){ return this.type; } } package algorithm_4; import algorithm_4.Pet;; public class Dog extends Pet { public Dog() { super("dog"); } } package algorithm_4; public class Cat extends Pet { public Cat() { super("cat"); } } package algorithm_4; public class PetEnterQueue { private Pet pet; private long count; public PetEnterQueue(Pet pet, long count) { this.pet = pet; this.count = count; } public Pet getPet(){ return this.pet; } public long getCount(){ return this.count; } public String getEnterPetTye(){ return this.pet.getPetType(); } } package algorithm_4; import java.util.LinkedList; import java.util.Queue; public class DogCatQueue { private Queue<PetEnterQueue> dogQ; private Queue<PetEnterQueue> catQ; private long count; public DogCatQueue() { this.dogQ = new LinkedList<PetEnterQueue>(); this.catQ = new LinkedList<PetEnterQueue>(); this.count = 0; } public void add(Pet pet){ if(pet.getPetType().equals("dog")){ this.dogQ.add(new PetEnterQueue(pet,this.count++)); } else if(pet.getPetType().equals("cat")){ this.catQ.add(new PetEnterQueue(pet,this.count++)); } else{ throw new RuntimeException("err, not dog or cat"); } } public Pet pollAll(){ if(!this.dogQ.isEmpty() && !this.catQ.isEmpty()){ if(this.dogQ.peek().getCount() <this.catQ.peek().getCount()){ return this.dogQ.poll().getPet(); } else{ return this.catQ.poll().getPet(); } } else if(!this.dogQ.isEmpty()){ return this.dogQ.poll().getPet(); } else if(!this.catQ.isEmpty()){ return this.catQ.poll().getPet(); } else{ throw new RuntimeException("err, queue is empty!"); } } public Dog pollDog(){ if(!this.isDogQueueEmpty()){ return (Dog) this.dogQ.poll().getPet(); } else{ throw new RuntimeException("Dog queue is empty!"); } } public Cat pollCat(){ if(!this.isCatQueueEmpty()){ return (Cat) this.catQ.poll().getPet(); } else{ throw new RuntimeException("Cat queue is empty!"); } } public boolean isEmpty(){ return this.dogQ.isEmpty() && this.catQ.isEmpty(); } public boolean isDogQueueEmpty(){ return this.dogQ.isEmpty() ; } public boolean isCatQueueEmpty(){ return this.catQ.isEmpty() ; } }

    转载请注明原文地址: https://ju.6miu.com/read-1201274.html
    最新回复(0)