猫狗算法(每日一道算法题)

package DogAndCatQueue;

/**
 * @author:MindMrWang
 *2017年11月16日
 *:function:
 */
public class Pet {
    String type;
    public Pet(String type) {
        this.type=type;

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

/**
 * @author:MindMrWang
 *2017年11月16日
 *:function:
 */
public class Dog extends Pet{
    public Dog() {
        super("dog");
    }
}
package DogAndCatQueue;

/**
 * @author:MindMrWang
 *2017年11月16日
 *:function:
 */
public class Cat extends Pet{
    public Cat() {
        super("cat");
    }

}

要求:
①用户可以调用add方法将cat类或者dog类的实例放入队列。
②用户可以调用pollAll方法将队列中所有的实例按照队列的先后顺序依次弹出。
③用户可以调用pollCat方法经队列中所有Cat实例按照队列的先后顺序与依次弹出。
④用户可以调用pollDog方法经队列中所有Dog实例按照队列的先后顺序与依次弹出。
⑤用户可以调用isEmpty方法判断队列是否为空。
⑥用户可以调用isDogEmpty方法,检查队列中是否有Dog实例。
⑦用户可以调用isCatEmpty方法,检查队列中是否有Cat实例。

本题需要将不同的实例盖上时间戳(进队的序号),但是又不能改变原有的Pet类,所以我们自定义一个类:

package DogAndCatQueue;

/**
 * @author:MindMrWang
 *2017年11月16日
 *:function:将不同的实例盖上时间戳
 */
public class PetEnterQueue {
    Pet type;
    long count;
    public PetEnterQueue(Pet type,long count) {
        this.type=type;
        this.count=count;
    }
    public Pet getType() {
        return type;
    }
    public long getCount() {
        return count;
    }
    public String getEnterPetType() {
        return this.type.getPetType();
    }
}
package DogAndCatQueue;

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

/**
 * @author:MindMrWang
 *2017年11月16日
 *:function:猫狗算法
 */
public class DogAndCatQueue {
    private Queue<PetEnterQueue> dogQ;
    private Queue<PetEnterQueue> catQ;
    long count;

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

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


    public Pet pollAll() {
        if(!dogQ.isEmpty()&&!catQ.isEmpty()) {
            if(dogQ.peek().count<catQ.peek().count) {
                return dogQ.poll().getType();
            }else {
                return catQ.poll().getType();
            }
        }else if(!dogQ.isEmpty()){
            return dogQ.poll().getType();
        }else if(!catQ.isEmpty()) {
            return catQ.poll().getType();
        }else {
            throw new RuntimeException("your queue is Empty");
        }
    }

    public Dog pollDog() {
        if(!dogQ.isEmpty()) {
            return (Dog)dogQ.poll().getType();
        }else {
            throw new RuntimeException("your queue is Empty");
        }
    }
    public Cat pollCat() {
        if(!dogQ.isEmpty()) {
            return (Cat)catQ.poll().getType();
        }else {
            throw new RuntimeException("your queue is Empty");
        }
    }


    public boolean isEmpty() {
        return dogQ.isEmpty()&&catQ.isEmpty();
    }

    public boolean isDogQueueEmpty() {
        return dogQ.isEmpty();
    }
    public boolean isCatQueueEmpty() {
        return catQ.isEmpty();
    }
}

参考资料《程序员代码面试指南》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值