猫狗队列

题目描述

实现一种猫狗队列
可以add,pollAll,pollDog,pollCat,isEmpty,isDogEmpty,isCatEmpty
要求如下:

  1. 用户可以调用add方法将cat类或者dog类的实例放入队列中;
  2. 用户可以调用pollAll方法,将队列中所有的实例按照队列的先后顺序依次弹出;
  3. 用户可以调用pollDog方法,将队列中dog类的实例按照队列的先后顺序依次弹出;
  4. 用户可以调用pollCat方法,将队列中cat类的实例按照队列的先后顺序依次弹出;
  5. 用户可以调用isEmpty方法,检查队列中是否还有dog和cat的实例;
  6. 用户可以调用isDogEmpty方法,检查队列中是否还有do的实例;
  7. 用户可以调用isCatEmpty方法,检查队列中是否还有cat的实例。

解题思路

构建猫和狗两个队列,设计一个类PetEnterQueue ,用于记录放入队列的每个元素的时间戳,取出时按时间戳来判断从dog队列或cat队列取出元素

代码

package TestNode.StackAndQueue;

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

public class CatDogQueue {
    public static class Pet{
        private String type;

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

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

    /*先定义一个新类可以记录入队时间*/
    public static class PetEnterQueue{
        private Pet pet;
        private long count;

        public PetEnterQueue(Pet pet, long count){
            this.pet = pet;
            this.count = count;
        }

        public long getCount() {
            return count;
        }

        public Pet getPet() {
            return pet;
        }

        public String getEnterPetType(){
            return pet.getType();
        }
    }

    private Queue<PetEnterQueue> dogQueue;
    private Queue<PetEnterQueue> catQueue;
    private long count;

    public CatDogQueue(){
        dogQueue = new LinkedList<>();
        catQueue = new LinkedList<>();
        count = 0;
    }

    public void add(Pet pet){
        if (pet.getType().equals("Dog")){
            this.dogQueue.add(new PetEnterQueue(pet, count++));
        }else if (pet.getType().equals("Cat")){
            this.catQueue.add(new PetEnterQueue(pet, count++));
        }else {
            throw new RuntimeException("err, not dog or cat");
        }
    }

    public Pet pollAll(){
        if (!this.dogQueue.isEmpty() && !this.catQueue.isEmpty()){
            if (this.dogQueue.peek().getCount() < this.catQueue.peek().getCount()){
                return this.dogQueue.poll().getPet();
            }else {
                return this.catQueue.poll().getPet();
            }
        }else if (!this.dogQueue.isEmpty()){
            return dogQueue.poll().getPet();
        }else if (!this.dogQueue.isEmpty()){
            return this.catQueue.poll().getPet();
        }else {
            throw new RuntimeException("err, queue is empty");
        }
    }
    public Dog pollDog() {
        if (!isDogEmpty()) {
            return (Dog) this.dogQueue.poll().getPet();
        } else {
            throw new RuntimeException("err,dog queue is empty");
        }
    }

    public Cat pollCat() {
        if (!isCatEmpty()) {
            return (Cat) this.catQueue.poll().getPet();
        } else {
            throw new RuntimeException("err,cat queue is empty");
        }
    }

    public boolean isEmpty() {
        return this.dogQueue.isEmpty() && this.catQueue.isEmpty();
    }

    public boolean isDogEmpty() {
        return this.dogQueue.isEmpty();
    }

    public boolean isCatEmpty() {
        return this.catQueue.isEmpty();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值