1-4 实现猫狗队列

该博客讨论了如何实现猫狗队列,通过维护三个队列和使用时间戳记录入队顺序。提出两种解题方法,一种是使用额外的队列记录时间和对象,另一种是对对象进行包装,存储时间戳。每种方法都有其优缺点。
摘要由CSDN通过智能技术生成

题目描述

  • 实现猫狗队列。
    在这里插入图片描述
    在这里插入图片描述

解题尝试

  • 我们可以定义三个队列catq,dogq和allq,catq只存放cat对象,dogq只存放dog对象,allq存放所有对象。这样all队列就可以记录所有元素的入队顺序。
  • 这样可以解决部分问题,但是如果要弹出一个dog对象或cat对象就难以实现了,因为如果要弹出的对象在allq队列中不是allq的队头那么就无法将allq队列中相应元素弹出。
  • 那么除了使用allq队列标识所有元素的入队顺序还有什么方法呢?
  • 我们可以针对每个dog或cat对象记录一个一一对应的时间戳来标识它们的入队时间,这样我们只要比较一下dog和cat两个队列谁的队头的时间戳更小谁就是总队列的队头。至于其他的操作就很简单了。

解题方法1

  • 根据上一步分析,解题思路就找到了。但是现在的难点是如何去记录每个对象入队的时间戳。
  • 很直接的想法是再新增两个队列,cattime和dogtime来记录每个对象入队的时间。
  • 但是时间戳的单位是毫秒,而一毫秒可以执行很多次入队操作了,如果直接使用时间戳可能所有元素的入队时间都是一样的,不过我们可以使用变量counttime来模拟时间戳,从0开始,每入队一个元素counttime加一。
  • 代码如下:
class queue{
   
   private Queue<Pet> catq;
   private Queue<Pet> dogq;
   private Queue<Long> cattime;
   private Queue<Long> dogtime;
   private long counttime;
   queue(){
   
       this.catq = new LinkedList<>();
       this.dogq = new LinkedList<>();
       this.cattime = new LinkedList<>();
       this.dogtime = new LinkedList<>();
       this.counttime = 0;
   }

   public void add(Pet p){
   
       if(p.getType().equals("dog")){
   
           this.dogq.add(p);
           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值