时间戳的运用之猫狗队列

241 阅读1分钟
package c;

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

/**
 * 实现一种狗猫队列的结构,要求如下: 用户可以调用add方法将cat类或dog类的实例放入队列中;
 * 用户可以调用pollAll方法,将队列中所有的实例按照进队列的先后顺序依次弹出;
 * 用户可以调用pollDog方法,将队列中dog类的实例按照进队列的先后顺序依次弹出;
 * 用户可以调用pollCat方法,将队列中cat类的实 例按照进队列的先后顺序依次弹出;
 * 用户可以调用isEmpty方法,检查队列中是 否还有dog或cat的实例; 用户可以调用isDogEmpty方法,
 * 检查队列中是否有dog 类的实例; 用户可以调用isCatEmpty方法,检查队列中是否有cat类的实例。
 * 要求以上所有方法时间复杂度都是O(1)
 *
 * @author cheng
 */
public class CatDogQueue {
    Queue<Element> catQueue = new LinkedList<>();
    Queue<Element> dogQueue = new LinkedList<>();
    Long seq = 0L;

    public static final String CAT_TYPE = "cat";
    public static final String DOG_TYPE = "dog";

    public void add(Pet pet) {
        Element element = new Element(pet, seq);
        seq++;
        if (Objects.equals(pet.getType(), CAT_TYPE)) {
            catQueue.add(element);
        } else if (Objects.equals(pet.getType(), DOG_TYPE)) {
             dogQueue.add(element);
        } else {
            throw new RuntimeException("unknown pet type");
        }
    }

    public Pet pollAll() {
        if (!dogQueue.isEmpty() && !catQueue.isEmpty()) {
            Element cat = catQueue.peek();
            Element dog = dogQueue.peek();
            if (cat.getSeq() < dog.getSeq()) {
                return catQueue.poll().getPet();
            } else {
                return dogQueue.poll().getPet();
            }
        } else if (!dogQueue.isEmpty()) {
            return dogQueue.poll().getPet();
        } else if (!catQueue.isEmpty()) {
            return catQueue.poll().getPet();
        }
        return null;
    }

    public Pet pollDog() {
        if (!dogQueue.isEmpty()) {
            return dogQueue.poll().getPet();
        }
        return null;
    }

    public Pet pollCat() {
        if (!catQueue.isEmpty()) {
            return catQueue.poll().getPet();
        }
        return null;
    }
}

class Pet {
    String type;

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

    public String getType() {
        return type;
    }
}

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

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

class Element {
    Pet pet;
    Long seq;

    public Element(Pet pet, Long seq) {
        this.pet = pet;
        this.seq = seq;
    }

    public Pet getPet() {
        return pet;
    }

    public Long getSeq() {
        return seq;
    }
}