貓狗隊列

本題來自程序員代碼面試指南


實現(xiàn)一種狗貓隊列的結(jié)構(gòu),要求如下:

● 用戶可以調(diào)用add方法將cat類或dog類的實例放入隊列中;

● 用戶可以調(diào)用pollAll方法,將隊列中所有的實例按照進隊列的先后順序依次彈出;

● 用戶可以調(diào)用pollDog方法,將隊列中dog類的實例按照進隊列的先后順序依次彈出;

● 用戶可以調(diào)用pollCat方法,將隊列中cat類的實例按照進隊列的先后順序依次彈出;

● 用戶可以調(diào)用isEmpty方法,檢查隊列中是否還有dog或cat的實例;

● 用戶可以調(diào)用isDogEmpty方法,檢查隊列中是否有dog類的實例;

● 用戶可以調(diào)用isCatEmpty方法,檢查隊列中是否有cat類的實例

這個題的用雙隊列實現(xiàn),要解決的關(guān)鍵點是如何判斷倆個隊列的隊頭元素入隊的先后。解決的方法是擴展寵物類,加上計數(shù)器(時間戳)來判斷入隊的先后(不能改變原來的類,我覺得這個題更加側(cè)重的是面向?qū)ο髷U展的思想)

public 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;//計數(shù)器
    }

    /**
     * 添加操作
     * @param pet
     */
    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("添加的既不是貓也不是狗");
        }
    }

    /**
     * 返回隊頭對象
     * @return
     */
    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("隊列是空的");
        }
    }

    /**
     * 返回隊頭的狗
     * @return
     */
    public Dog pollDog() {
        if (! this.isDogQueueEmpty()) {
            return (Dog) this.dogQ.poll().getPet();
        } else {
            throw new RuntimeException("狗隊列為空");
        }
    }

    public Cat pollCat() {
        if (! this.isCatQueueEmpty()) {
            return (Cat) this.catQ.poll().getPet();
        } else
            throw new RuntimeException("貓隊列為空");
    }

    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 class Pet {
    private String type;

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

    public String getPetType() {
        return this.type;
    }
}
public class Cat extends Pet {
    public Cat() {
        super("cat");
    }
}
public class Dog extends Pet {
    public Dog() {
        super("dog");
    }
}
public 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();
    }
}

最后附上github地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容