猫狗队列(面试题)

题目:
宠物、狗和猫的类如下:
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类的实例。
思路:
构建猫和狗两个队列,设计一个类PetEnterQueue ,用于记录放入队列的每个元素的时间戳,取出时按时间戳来判断从dog队列或cat队列取出元素
代码:

package basic_class_03;

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

/**
 * 类名:Code_04_CatDogQueue<br>
 * 功能:<br>
 * 作者:java战士<br>
 * 日期:2019/8/23<br>
 * 版本:v1.0.0
 * 历史修订:
 */
public class Code_04_CatDogQueue {
    public static class Pet{
        private String type;
        private String name;

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

        public String getType() {
            return type;
        }

        public String getName() {
            return name;
        }
    }
    public static class Dog extends Pet {
        public Dog(String name) {
            super("dog",name);
        }
    }
    public static class Cat extends Pet{
        public Cat(String name){
            super("cat",name);
        }
    }
    public static class PetEnter{
        private Pet pet;
        private long count;

        public PetEnter(Pet pet, long count) {
            this.pet = pet;
            this.count = count;
        }
        public Pet getPet(){
            return this.pet;
        }
        public long getCount(){
            return this.count;
        }
        public String getEnterPetType(){
            return this.pet.getType();
        }
    }

    public static class DogCatQueue{
        private Queue<PetEnter> dogQ;
        private Queue<PetEnter> catQ;
        private long count;
        public DogCatQueue(){
            this.dogQ=new LinkedList<PetEnter>();
            this.catQ=new LinkedList<PetEnter>();
            this.count=0;
        }

        public void add(Pet pet){
            if (pet.getType().equals("dog")){
                this.dogQ.add(new PetEnter(pet,count++));
            }else if (pet.getType().equals("cat")){
                this.catQ.add(new PetEnter(pet,count++));
            }else {
                throw new RuntimeException("error,not dog or cat!");
            }
        }
        public Pet pollAll(){
            if (!this.catQ.isEmpty() && !this.dogQ.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("cat and dog is empty!");
            }
        }
        public Pet pollDog(){
            if (!this.dogQ.isEmpty()){
                return this.dogQ.poll().getPet();
            }else {
                throw new RuntimeException("dogQ is empty!");
            }
        }
        public Pet pollCat(){
            if (!this.catQ.isEmpty()){
                return this.catQ.poll().getPet();
            }else {
                throw new RuntimeException("catQ is empty!");
            }
        }
        public boolean isPetEmpty(){
            return this.dogQ.isEmpty()&&this.catQ.isEmpty();
        }
        public boolean isDogEmpty(){
            return this.dogQ.isEmpty();
        }
        public boolean isCatEmpty(){
            return this.catQ.isEmpty();
        }
    }

    //for test
    public static void main(String[] args){
        DogCatQueue test=new DogCatQueue();
        Pet dog1=new Dog("dog1");
        Pet cat1=new Cat("cat1");
        Pet dog2=new Dog("dog2");
        Pet cat2=new Cat("cat2");
        Pet dog3=new Dog("dog3");
        Pet cat3=new Cat("cat3");

        test.add(dog1);
        test.add(cat1);
        test.add(dog2);
        test.add(cat2);
        test.add(dog3);
        test.add(cat3);

        test.add(dog1);
        test.add(cat1);
        test.add(dog2);
        test.add(cat2);
        test.add(dog3);
        test.add(cat3);

        test.add(dog1);
        test.add(cat1);
        test.add(dog2);
        test.add(cat2);
        test.add(dog3);
        test.add(cat3);

//        while (!test.isDogEmpty()){
//            System.out.print(test.pollDog().getName()+" ");
//        }
//        System.out.println();
        System.out.println("========================");
        while (!test.isPetEmpty()){
            System.out.print(test.pollAll().getName()+" ");
        }
    }


}

测试结果:
按照先进先出的顺序输出
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值