题目描述
- 实现猫狗队列。
解题尝试
- 我们可以定义三个队列catq,dogq和allq,catq只存放cat对象,dogq只存放dog对象,allq存放所有对象。这样all队列就可以记录所有元素的入队顺序。
- 这样可以解决部分问题,但是如果要弹出一个dog对象或cat对象就难以实现了,因为如果要弹出的对象在allq队列中不是allq的队头那么就无法将allq队列中相应元素弹出。
- 那么除了使用allq队列标识所有元素的入队顺序还有什么方法呢?
- 我们可以针对每个dog或cat对象记录一个一一对应的时间戳来标识它们的入队时间,这样我们只要比较一下dog和cat两个队列谁的队头的时间戳更小谁就是总队列的队头。至于其他的操作就很简单了。
解题方法1
- 根据上一步分析,解题思路就找到了。但是现在的难点是如何去记录每个对象入队的时间戳。
- 很直接的想法是再新增两个队列,cattime和dogtime来记录每个对象入队的时间。
- 但是时间戳的单位是毫秒,而一毫秒可以执行很多次入队操作了,如果直接使用时间戳可能所有元素的入队时间都是一样的,不过我们可以使用变量counttime来模拟时间戳,从0开始,每入队一个元素counttime加一。
- 代码如下:
class queue{
private Queue<Pet> catq;
private Queue<Pet> dogq;
private Queue<Long> cattime;
private Queue<Long> dogtime;
private long counttime;
queue(){
this.catq = new LinkedList<>();
this.dogq = new LinkedList<>();
this.cattime = new LinkedList<>();
this.dogtime = new LinkedList<>();
this.counttime = 0;
}
public void add(Pet p){
if(p.getType().equals("dog")){
this.dogq.add(p);