立即学习:https://edu.csdn.net/course/play/29510/422746?utm_source=blogtoedu
栈和队列(五)&(六):猫狗队列
猫狗队列问题
题目:运用队列的功能,在指定用户的类的基础上,实现以下各种功能
要求:
1.用户可以调用add方法将cat类或dog类的实例放入队列中;
2用户可以调用pollAll方法, 将队列中所有的实例按照进队列的先后顺序依次弹出;
3.用户可以调用pollDog方法,将队列中dog类的实例按照进队列的先后顺序依次弹出;
4.用户可以调用pollCat方法, 将队列中cat类的实例按照进队列的先后顺序依次弹出;
5用户可以调用IsSEmpy方法, 检查队列中是否还有dog或cat的实例:
6.用户可以调用isDogEmpty方法,检查队列中是否有dog类的实例:
7.用户可以调用IsCaEmpty方法。检查队列中是否有cart类的实例。
猫狗队列问题常见的设计错误
错误1: cat队列只放cat实例,dog队列只放dog实例,再用一个总队列放所有的实例。
错误原因:cat、dog以及总队列的更新问题。虽然pollAll可以满足,pollCat的时候,Cat队列可以全部弹出,但是Pet队列如何同步,pollDog也是同样的问题。
错误2: 用哈希表, key表示一个cat实例或dog实例, value表示这个实例进队列的次序。
错误原因: 不能支持—个实例多次进队列的功能需求,因为哈希表的key只能对应一个value值
错误3: 将用户原有的cat或dog类改写,加一个计数项来表示某一个实例进队列的时间。
错误原因: 不能擅自改变用户的类结构。
【方法思路】
新定义一个类,将原有的用户的类作为成员变量之一,再添加一个count作为时间戳进行排序,根据时间戳来poll
每次比较count, 哪边小弹出哪边
【代码】
Pet类
public class Pet { private String type; public Pet(String type) { this.type = type; } public Pet() { super(); } public String getType() { return type; } }Cat类
public class Cat extends Pet { public Cat() { super("cat"); } }Dog类
public class Dog extends Pet { public Dog() { super("dog"); } }新定义的PetEnterQueue类,Pet作为属性,并设置时间戳属性
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 pet; } public long getCount() { return count; } public String getPetEnterQueue(){ return this.getPetEnterQueue(); } }CatDogQueue
import sun.rmi.runtime.NewThreadAction; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; /** * 代码只是为了实现我们的想法 * 不是学习算法和数据结构中最重要的东西 * * */ public class CatDogQueue { private Queue<PetEnterQueue> dogQ; private Queue<PetEnterQueue> catQ; private long count; public CatDogQueue() { this.dogQ = new LinkedList<PetEnterQueue>(); this.catQ = new LinkedList<PetEnterQueue>(); this.count = 0; } public void add(Pet pet) { if (pet.getType().equals("dog")) { this.dogQ.add(new PetEnterQueue(pet, this.count++)); } else if (pet.getType().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 Pet pollDog() { if (!this.isDogQueueEmpty()) { return this.dogQ.poll().getPet(); } else { throw new RuntimeException("Dog queue is empty ! "); } } public Pet pollCat() { if (!this.isCatQueueEmpty()) { return 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(); } public static void main(String[] args) { CatDogQueue catDogQueue = new CatDogQueue(); System.out.println(catDogQueue.count); catDogQueue.add(new Pet("cat")); catDogQueue.add(new Pet("cat")); catDogQueue.add(new Pet("cat")); catDogQueue.add(new Pet("dog")); catDogQueue.add(new Pet("cat")); catDogQueue.add(new Pet("dog")); catDogQueue.add(new Pet("cat")); catDogQueue.add(new Pet("dog")); catDogQueue.add(new Pet("dog")); System.out.println(catDogQueue.count); System.err.println(catDogQueue.catQ.size()); for (int i = 0; i< catDogQueue.catQ.size() - 1 ; i++){ System.out.println(catDogQueue.pollDog().getType()); } for (int i = 0; i< catDogQueue.count ; i++){ System.out.println(catDogQueue.pollAll().getType()); } } }