本题来自左神《程序员面试代码指南》“猫狗队列”题目。

题目

宠物、狗和猫的类如下:

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()、pollCat(),将队列中dog类、cat类的实例按照进队列的先后顺序依次弹出
  • 用户可以调用isEmpty(),检查队列中是否还有dog、cat的实例
  • 用户可以调用isDogEmpty()、isCatEmpty(),分别检查队列中是否还有dog、cat的实例

解答

public static class PetEnterQueue {private Pet pet;private long count;public PetEnterQueue(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.getPetType();}
}


package chapter_1_stackandqueue;import java.util.LinkedList;
import java.util.Queue;public class Problem_04_DogCatQueue {public static class Pet {private String type;public Pet(String type) {this.type = type;}public String getPetType() {return this.type;}}public static class Dog extends Pet {public Dog() {super("dog");}}public static class Cat extends Pet {public Cat() {super("cat");}}public static class PetEnterQueue {private Pet pet;private long count;public PetEnterQueue(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.getPetType();}}public static class DogCatQueue {private Queue<PetEnterQueue> dogQ;private Queue<PetEnterQueue> catQ;private long count;public DogCatQueue() {this.dogQ = new LinkedList<PetEnterQueue>();this.catQ = new LinkedList<PetEnterQueue>();this.count = 0;}public void add(Pet pet) {if (pet.getPetType().equals("dog")) {this.dogQ.add(new PetEnterQueue(pet, this.count++));} else if (pet.getPetType().equals("cat")) {this.catQ.add(new PetEnterQueue(pet, this.count++));} else {throw new RuntimeException("err, not dog or cat");}}public Pet pollAll() {if (!this.dogQ.isEmpty() && !this.catQ.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("err, queue is empty!");}}public Dog pollDog() {if (!this.isDogQueueEmpty()) {return (Dog) this.dogQ.poll().getPet();} else {throw new RuntimeException("Dog queue is empty!");}}public Cat pollCat() {if (!this.isCatQueueEmpty()) {return (Cat) this.catQ.poll().getPet();} elsethrow new RuntimeException("Cat queue is empty!");}public boolean isEmpty() {return this.dogQ.isEmpty() && this.catQ.isEmpty();}public boolean isDogQueueEmpty() {return this.dogQ.isEmpty();}public boolean isCatQueueEmpty() {return this.catQ.isEmpty();}}public static void main(String[] args) {DogCatQueue test = new DogCatQueue();Pet dog1 = new Dog();Pet cat1 = new Cat();Pet dog2 = new Dog();Pet cat2 = new Cat();Pet dog3 = new Dog();Pet cat3 = new Cat();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.isDogQueueEmpty()) {System.out.println(test.pollDog().getPetType());}while (!test.isEmpty()) {System.out.println(test.pollAll().getPetType());}}}

运行结果:

dog
dog
dog
dog
dog
dog
dog
dog
dog
cat
cat
cat
cat
cat
cat
cat
cat
cat

左神算法:猫狗队列(通过给不同实例盖时间戳的方法实现)相关推荐

  1. 数据结构与算法之猫狗队列

    数据结构与算法之猫狗队列 目录 猫狗队列 1. 猫狗队列 描述 代码实现 import java.util.LinkedList; import java.util.Queue;public clas ...

  2. 算法练习day8——190326(猫狗队列、转圈打印矩阵、旋转正方形矩阵、反转单向双向链表、数N的加法组合)

    1.猫狗队列 [题目] 宠物. 狗和猫的类如下: public class Pet {private String type;public Pet(String type) {this.type = ...

  3. 左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)

    本题来自左神<程序员面试代码指南>"最大值减去最小值小于或等于num的子数组的数量"题目. 题目 给定数组 arr 和整数 num,共返回有多少个子数组满足如下情况: ...

  4. 左神算法:求最大子矩阵的大小(Java版)

    本题来自左神<程序员面试代码指南>"求最大子矩阵的大小"题目. 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1 ...

  5. JAVA中在某游戏系统有猫狗猪_算法面试题之猫狗队列(java)

    [题目]: 已知有宠物:狗.猫如下,实现一种猫狗队列的结构: /** * @ClassName Pet * @Description 宠物 * @Author Huarray * @Date 2019 ...

  6. 程序员代码面试指南第二版 4.猫狗队列

    welcome to my blog 程序员代码面试指南第二版 4.猫狗队列 题目描述 题目描述 实现一种猫狗队列的结构,要求如下: 1. 用户可以调用 add 方法将 cat 或者 dog 放入队列 ...

  7. 左神算法:判断 t1 树中是否有与 t2 树拓扑结构完全相同的子树(Java版)

    本题来自左神<程序员代码面试指南>"判断 t1 树中是否有与 t2 树拓扑结构完全相同的子树"题目. 题目 给定彼此独立的两棵树头节点分别为 t1 和 t2,判断 t1 ...

  8. 左神算法:二叉树的按层打印与ZigZag打印(Java版)

    本题来自左神<程序员代码面试指南>"二叉树的按层打印与ZigZag打印"题目. 题目 给定一棵二叉树的头节点 head,分别实现 按层 和 ZigZag 打印 二叉树的 ...

  9. 左神算法:将搜索二叉树转换成双向链表(Java版)

    本题来自左神<程序员代码面试指南>"将搜索二叉树转换成双向链表"题目. 题目 对二叉树的节点来说,有本身的值域,有指向左孩子节点和右孩子节点的两个指针:对双向链表的节点 ...

最新文章

  1. Zigbee如何在智能家居中成为领先的连接技术?
  2. jar打包 jar line too long 异常处理方法
  3. 瑞幸咖啡股价再大涨超36% 目前总市值约13.87亿美元
  4. 终于有人把项目搭建讲明白了!
  5. 详解Python函数式编程之map、reduce、filter
  6. python入门指南-Python 入门指南
  7. 无问西东,哪怕重头来过
  8. ImportError: cannot import name UnrewindableBodyError
  9. BlueViewer 地图加载分析(C#)
  10. JS数组 团里添加新成员(向数组增加一个新元素)只需使用下一个未用的索引,任何时刻可以不断向数组增加新元素。myarray[5]=88;...
  11. springmvc或者springboot 中实现跨域的5种方式
  12. 【三维路径规划】基于matlab A_star算法无人机三维路径规划【含Matlab源码 446期】
  13. Excel度分秒转度--公式大解析
  14. vs2015卸载指南
  15. 海外邮件收发阻碍多?【企业邮箱怎么申请】
  16. 常用API——Object、Objects、StringBuilder
  17. C++ Bayer图像格式,使用GDAL进行格式转换。
  18. 小程序与后台 api接口数据交互详解(微信报修小程序源码讲解七)
  19. 用C语言编写一个“简单”的程序答题系统
  20. 涂抹式水光针的使用方法你知道吗?

热门文章

  1. POJ - 2778 DNA Sequence(AC自动机+矩阵快速幂)
  2. (转)二维平面坐标系-最近点对模板
  3. 中石油训练赛 - 小说(最短路+二分)
  4. HDU - 2859 Phalanx(动态规划/哈希表)
  5. linux 提交git,linux下git使用记录1 git 提交
  6. 两个相邻盒子的边框怎么只显示一个_一篇文章带你快速理解盒子模型「经典案例」...
  7. Jenkins 设置镜像_docker+jenkins自动化部署
  8. 2021已去,2022未来
  9. Cannot add or update a child row: a foreign key constraint fails (`university`.`instructor`, CONSTRA
  10. 容器中构建镜像慢,在dockerfile中换源加速