4、猫狗队列

文章介绍了一个Java实现的特殊队列结构,该队列能分别处理Dog和Cat对象,支持按进队顺序弹出所有实例,按类型单独弹出Dog或Cat,以及检查队列状态。队列由两个内部类PetQueueElement和CatDogQueue组成,分别存储不同类型的实例及其进队编号。
摘要由CSDN通过智能技术生成

题目

宠物、狗和猫的类如下:

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类实例;

解法

这种特殊的队列需要dog队列和cat队列分别存储,通过记录实例的进队编号来存储整个队列的进队顺序。
首先定义队列中的元素petQueueElement,元素存储实例以及编号。

public class PetQueueElement {
    private Pet pet;
    private long i;

    public PetQueueElement(Pet element, long i) {
        this.pet = element;
        this.i = i;
    }

    public Pet getPet() {
        return this.pet;
    }

    public long getI() {
        return this.i;
    }

    public String getCurrentElementType() {
        return this.pet.getPetType();
    }
}

分别定义dogQ队列以及catQ队列,实现题目要求的7种操作。

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

public class CatDogQueue {
    private Queue<PetQueueElement> dogQ;
    private Queue<PetQueueElement> catQ;
    private long count;

    public CatDogQueue() {
        this.dogQ = new LinkedList<PetQueueElement>();
        this.catQ = new LinkedList<PetQueueElement>();
        this.count = 0;
    }

    public void add(Pet pet) {
        if(pet.getPetType().equals("dog")){
            this.dogQ.add(new PetQueueElement(pet, this.count++));
        }else if(pet.getPetType().equals("cat")){
            this.catQ.add(new PetQueueElement(pet, this.count++));
        }else{
            throw new RuntimeException("Element is not cat or dog!");
        }
    }

    public Pet pollAll() {
        if(!this.dogQ.isEmpty() && !this.catQ.isEmpty()){
            if(this.dogQ.peek().getI() > this.catQ.peek().getI()){
                return this.catQ.poll().getPet();
            }else{
                return this.dogQ.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("Your queue 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 isEmpty(){
        return this.dogQ.isEmpty() && catQ.isEmpty();
    }

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

    public boolean isCatEmpty(){
        return this.catQ.isEmpty();
    }
}

测试

public class a1_b4_catDogQueue {
    public static void main(String[] args) {
        Cat cat1 = new Cat();
        Cat cat2 = new Cat();
        Cat cat3 = new Cat();
        Dog dog1 = new Dog();
        Dog dog2 = new Dog();
        Dog dog3 = new Dog();
        CatDogQueue catDogQueue = new CatDogQueue();
        catDogQueue.add(cat1);
        catDogQueue.add(dog1);
        catDogQueue.add(cat2);
        System.out.println(catDogQueue.pollAll().getPetType());
        System.out.println(catDogQueue.pollAll().getPetType());
        System.out.println(catDogQueue.isDogEmpty());
        System.out.println(catDogQueue.isEmpty());
        System.out.println(catDogQueue.pollAll().getPetType());
    }
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值