首页 > 其他分享 >04_猫狗队列

04_猫狗队列

时间:2023-10-05 20:47:34浏览次数:34  
标签:return 04 队列 pet Pet isEmpty public

猫狗队列

【题目】

宠物、狗和猫的类如下:

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类的实例按照进队列的先后顺序依次弹出;
  • 用户可以调用isEmpty方法,检查队列中是否还有dog或cat的实例;
  • 用户可以调用isDogEmpty方法,检查队列中是否有dog类的实例;
  • 用户可以调用isCatEmpty方法,检查队列中是否有Cat类的实例。

注意:

  1. cat队列只放cat实例,dog队列只放dog实例,再用一个总队列放所有的实例。

    错误原因:cat、dog以及总队列的更新问题

  2. 用哈希表,key表示一个cat实例或dog实例,value表示这个实例进队列的次序。

    错误原因:不能支持一个实例多次进队列的功能需求,因为哈希表的key只能对应一个value值。

  3. 将用户原有的cat或dog类改写,加一个计数项来表示某一个实例进队列的时间。

    错误原因:不能擅自改变用户的类结构。

参考代码如下:

import java.util.Queue;
import java.util.LinkedList;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

// 如何解决不能修改封装的类

/**
 * 1. 在实际情况下,对于封装好的类往往不能修改其中的代码,如何对其增加属性呢?即对其进行再封装
 * 2. 在本题中,有两个类,它们有沟通的父类,为了对两个类一起封装,采用了封装其共同父类的方法。
 */
class Pet {

    private String type;
    private int id;

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

    public String getPetType() {
        return this.type;
    }

    public int getId() {
        return this.id;
    }

}

class Cat extends Pet {
    public Cat(int id) {
        super("cat", id);

    }
}

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

// 创建一个类, 用于收容上述两个类
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 getPetEnterType() {
        return this.pet.getPetType();
    }

}

// 使用两个队列存放不同的类

/**
 * 1.为了存放不同的两个类,一种办法是放到一个队列中,操作的时候,每一次都要出队,包括弹出队列,判断队列中的每一个类是否为空,时间复杂度较高
 * 2.使用"空间换时间"的思想,将两个类的对立队列封装好,使用时间戳的方式记录其进入队列的顺序,这样既可以操作总的序列,也可以单独操作不同的类
 */
class DogCatQueue {
    private Queue<PetEnter> catQueue;
    private Queue<PetEnter> dogQueue;
    private long count;  // 时间戳

    public DogCatQueue() {
        this.catQueue = new LinkedList<>();
        this.dogQueue = new LinkedList<>();
        this.count = 0;
    }

    // 用户调用add方法可以将cat或者dog放入队列中
    public void add(Pet pet) {

        //按照类型放入动物队列中
        if (pet.getPetType().equals("dog")) {
            this.dogQueue.add(new PetEnter(pet, this.count++));
        } else if (pet.getPetType().equals("cat")) {
            this.catQueue.add(new PetEnter(pet, this.count++));
        } else {
            throw new RuntimeException("error no thus class");
        }
    }

    public Pet pollAll() {
        if (!this.catQueue.isEmpty() && !this.dogQueue.isEmpty()) {
            if (this.catQueue.peek().getCount() < this.dogQueue.peek().getCount()) {
                return this.catQueue.poll().getPet();
            } else {
                return this.dogQueue.poll().getPet();
            }
            //否则就是其中一个为空
        } else if (!this.catQueue.isEmpty()) {  //狗空了,猫没有空
            return this.catQueue.poll().getPet();
        } else if (!this.dogQueue.isEmpty()) { //猫空了, 狗没有空
            return this.dogQueue.poll().getPet();
        } else {
            return null;
        }
    }

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

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

    // 判断队列是否为空
    public boolean isEmpty() {
        if (this.dogQueue.isEmpty() && this.catQueue.isEmpty()) {
            return true;
        }
        return false;
    }

    // 判断狗队列是否为空
    public boolean isDogEmpty() {
        if (this.dogQueue.isEmpty()) {
            return true;
        }
        return false;
    }

    // 判断猫队列是否为空
    public boolean isCatEmpty() {
        if (this.catQueue.isEmpty()) {
            return true;
        }
        return false;
    }
    public static void main(String[] args) throws IOException {

        DogCatQueue dogCatQueue = new DogCatQueue();

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine());

        // 保存结果的数组
        for (int i = 0; i < N; ++i) {
            StringBuilder result = new StringBuilder();
            String[] strArr = reader.readLine().split(" ");
            String option = strArr[0];
            switch (option) {
                case "add":
                    String type = strArr[1];
                    if (type.equals("dog")) {
                        int id = Integer.parseInt(strArr[2]);
                        dogCatQueue.add(new Pet("dog", id));
                    } else if (type.equals("cat")) {
                        int id = Integer.parseInt(strArr[2]);
                        dogCatQueue.add(new Pet("cat", id));
                    }
                    break;
                case "pollAll":
                    while (!dogCatQueue.isEmpty()) {
                        Pet pet = dogCatQueue.pollAll();
                        result.append(pet.getPetType()).append(" ").append(pet.getId()).append("\n");
                    }
                    System.out.print(result);
                    break;
                case "pollDog":
                    while (!dogCatQueue.isDogEmpty()) {
                        Pet pet = dogCatQueue.pollDog();
                        result.append(pet.getPetType()).append(" ").append(pet.getId()).append("\n");
                    }
                    System.out.print(result);
                    break;
                case "pollCat":
                    while (!dogCatQueue.isCatEmpty()) {
                        Pet pet = dogCatQueue.pollCat();
                        result.append(pet.getPetType()).append(" ").append(pet.getId()).append("\n");
                    }
                    System.out.print(result);
                    break;
                case "isDogEmpty":
                    System.out.println(dogCatQueue.isDogEmpty() ? "yes" : "no");
                    break;
                case "isCatEmpty":
                    System.out.println(dogCatQueue.isCatEmpty() ? "yes" : "no");
                    break;
                case "isEmpty":
                    System.out.println(dogCatQueue.isEmpty() ? "yes" : "no");
                    break;
            }
        }
    }
}

标签:return,04,队列,pet,Pet,isEmpty,public
From: https://www.cnblogs.com/codingbao/p/17743879.html

相关文章

  • 20231004
    23/10/04NOIP模拟赛总结时间安排7:40-8:00看题,感觉都没有思路,有点慌。8:20-9:00思考T1,先把暴力打了,打表找规律找了20分钟。9:00-9:30写T2暴力,感觉前两题都是DP,但不会设状态,原因在反思总结中有提到。9:30-10:20想到了T3的\(n^2\)做法,但是没想明白细节,弃疗。10:20-11:0......
  • 231004校内赛
    T1水管题解很简单的一道题,别想复杂了只要一边\(dfs\)即可先将当前点的所有水量给出去,如果缺水就给出去负数那么等到最后一个节点如果不是刚好合适,那么就把剩余水量回溯回来,无论正负再如此给下一个连边的点如果最后一个点刚好合适那么给下一个点的就是\(0\)实现很简单......
  • Ubuntu 20.04 搭建 Timemachine
    创建一个目录,作为TimeMachine保存数据的目录。$sudomkdir/usr/local/timemachine$sudochownnobody:nogroup/usr/local/timemachine$sudochmod777/usr/local/timemachine安装netatalk服务和avahi-daemon服务。$sudoaptinstallnetatalkavahi-daemon编辑net......
  • 04-05 8.30下 子网划分
    网速100M  位/s(秒) 12.5M  字节/s(秒)1000M 位/s(秒) 125M  字节/s(秒)存储单位1字节 byte=8位bit  8倍2G大片,100M网速,下载需要2.73分钟 2048/12.5/60=2.73min1KB  =1024字节1MB  =1024KB1GB  =1024MB1TB  =1024GB1PB  =1024T......
  • 2023_10_04
    做笔记方法/学习方法有文档的不要记,除非有不懂的地方,可以做批注。或者按功能记。记环境配置、实际遇到的问题及解决方案、常用的功能组合方案但是记得,学习文档时,理解了,必须敲一遍代码,虽然不记笔记,但要实践pinia持久化插件pinia-plugin-persistedstate代码规范校验与格式化插......
  • RabbitMQ 死信交换机、延迟队列、惰性队列
    如果一个队列设置了死信交换机,该队列的消息就有了极大的可靠性保障,当出现以下情况时,消息就会投递到死信交换机中:队列中的消息在被消费者处理后,抛出异常,返回了nack或者reject如果队列设置了ttl或者消息本身设置了ttl,消息因为超时而未消费队列容量已经满了,后续发来的消息......
  • vue:路由错误/404 not found(vue-router@4.2.4)
     一,官方文档地址: https://router.vuejs.org/zh/guide/essentials/dynamic-matching.html二,代码:1,router配置{path:'/:pathMatch(.*)*',name:'NotFound',meta:{title:"路由未匹配",top:"3"},component:NotFound},2,notfound.vue......
  • 231004.md
    2023/10/04模拟赛总结时间安排07:40-08:20看题,写A,B,感觉会C。08:20-08:40写C暴力。08:40-09:10写换根部分,思考怎么不用平衡树。09:10-10:10写平衡树,调代码。拍C。10:10-10:20写D暴力。10:20-10:40拍A,B。10:40-11:20写D40分。11:20-1......
  • 20231004
    20231004NOIP#15总结时间安排7:40~8:00看题,\(A,B\)会第一档爆搜,别的不会。8:00~9:30写完\(A,B\)的爆搜。9:30~11:00会了\(C\)的暴力还加了点优化,一下写了\(1.5h\),不过有点难写。(我是真没想到连个菊花图都没有直接\(AC\)了11:00~11:40\(D\)能看出是线段树但一点......
  • 2023-10-04:用go语言,现有一棵无向、无根的树,树中有 n 个节点,按从 0 到 n - 1 编号 给你
    2023-10-04:用go语言,现有一棵无向、无根的树,树中有n个节点,按从0到n-1编号给你一个整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间存在一条边。每个节点都关联一个价格。给你一个整数数组price,其中price[i]是第i......