栈与队列(三)—— 猫狗队列

【题目】:已知宠物、猫和狗的类如下:

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");
	}
}

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

  • 用户可以调用add()方法将cat类或dog类的实例放入队列中。
  • 用户可以调用pollAll()方法,将队列中所有的实例按照进队列的先后顺序依次弹出。
  • 用户可以调用pollDog()方法,将队列中dog类的实例按照进队列的先后顺序依次弹出。
  • 用户可以调用pollCat()方法,将队列中cat类的实例按照进队列的先后顺序依次弹出。
  • 用户可以调用isEmpty()方法,检查队列是否还有dog或cat的实例。
  • 用户可以调用isDogEmpty()方法,检查队列中是否有dog类的实例。
  • 用户可以调用isCatEmpty()方法,检查队列中是否有cat类的实例。

【思考】:本题是实现在不同的实例上盖时间戳的方法,但是又不能改变用户本身的类,我们通过创建一个新的类来解决这个问题。

【方案】:我们创建一个新的类PetCountQueue。

public class PetCountQueue {
	private Pet pet;
	private long count;
	
	public Pet getPet() {
		return pet;
	}
	public void setPet(Pet pet) {
		this.pet = pet;
	}
	
	public long getCount() {
		return count;
	}
	public void setCount(long count) {
		this.count = count;
	}
}

根据题目要求,猫狗队列如下:

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

public class DogCatQueue {
	private Queue<PetCountQueue> dogQ;
	private Queue<PetCountQueue> catQ;
	private long count;
	
	public DogCatQueue(){
		dogQ = new LinkedList<PetCountQueue>();
		catQ = new LinkedList<PetCountQueue>();
		count = 0;
	}
/**用户可以调用add()方法将cat类或dog类的实例放入队列中。*/	
	public void add(Pet pet) {
		if(pet.getPetType().equals("dog")) {
			dogQ.add(new PetCountQueue(pet,count++));
		}else if(pet.getPetType().equals("cat")) {
			catQ.add(new PetCountQueue(pet,count++));
		}else {
			System.out.println("error,not dog or cat");
		}
	}
	
/**用户可以调用pollAll()方法,将队列中所有的实例按照进队列的先后顺序依次弹出。*/
	public Pet pollAll() {
		//如果猫和狗队列均不为空,通过时间戳【count】来决定弹出的数据。
		if(!catQ.isEmpty() && !dogQ.isEmpty()) {
			if(dogQ.peek().getCount() < catQ.peek().getCount()) {
				return dogQ.poll().getPet();
			}else {
				return catQ.poll().getPet();
			}
		//如果猫队列不为空,直接弹出猫队列
		}else if(!catQ.isEmpty()) {
			return catQ.poll().getPet();
		}else if(!dogQ.isEmpty()) {
			return dogQ.poll().getPet();
		}else {
			throw new RuntimeException("erroe,Queue is Empty");
		}
	}
	
/**用户可以调用pollDog()方法,将队列中dog类的实例按照进队列的先后顺序依次弹出。*/
	public Dog pollDog() {
		if(!isDogQueueEmpty()) {
			return (Dog) dogQ.poll().getPet();
		}else {
			throw new RuntimeException("The DogQueue is Empty");
		}
	}
	
/**用户可以调用pollCat()方法,将队列中cat类的实例按照进队列的先后顺序依次弹出。*/
	public Cat pollCat() {
		if(!isCatQueueEmpty()) {
			return (Cat) catQ.poll().getPet();
		}else {
			throw new RuntimeException("The CatQueue is Empty");
		}
	}
/**用户可以调用isEmpty()方法,检查队列是否还有dog或cat的实例。*/
	public boolean isEmpty() {
		return dogQ.isEmpty() && catQ.isEmpty();
	}
/**用户可以调用isDogEmpty()方法,检查队列中是否有dog类的实例。*/
	public boolean isDogQueueEmpty() {
		return dogQ.isEmpty();
	}
/**用户可以调用isCatEmpty()方法,检查队列中是否有cat类的实例。*/
	public boolean isCatQueueEmpty() {
		return catQ.isEmpty();
	}
}
发布了50 篇原创文章 · 获赞 37 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/m0_37868230/article/details/84324194
今日推荐