前言---
現在人有點精神,寫篇博客,晚點再去喫飯。人在,博客在!
(注:筆者水平有限,若有錯誤,請讀者慷慨指出)
貓狗隊列
題目:
package code_180;
//用戶自己定義的類,不允許修改
public class Pet {
private String type;
public Pet(String type) {
this.type = type;
}
public String getType() {
return this.type;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
class Dog extends Pet{
public Dog() {
super("Dog");
}
}
class Cat extends Pet{
public Cat() {
super("Cat");
}
}
實現一種貓狗隊列的結構,要求如下:
(1)用戶可以調用add方法將Cat類或dog類的實例放入隊列中;
(2)用戶可以調用pollAll方法,將隊列中所有實例按照進隊列的先後順序依次彈出
(3)用戶可以調用pollDog方法,將隊列中dog類的實例按照進隊列的先後順序依次彈出
(4)用戶可以調用pollCat方法,將隊列中cat類的實例按照進隊列的先後順序依次彈出
(5)用戶可以調用isEmpty方法,堅持隊列中是否還有dog或cat類的實例
(6)用戶可以調用isDogEmpty方法,檢查隊列中是否有dog類的實例
(7)用戶可以調用isCatEmpty方法,檢查隊列中是否有cat類的實例
分析:
其實這題主要考察的還是自定義數據機構的設計能力,唯一要注意的地方就是不能修改原用戶的數據結構,不然這題就沒什麼意義了,就是個垃圾題目了,假如運行修改Pet類,那麼我多加個計數變量不就可以了。。。。。。
注意了上面這點之後,我們就只能新定義一個類PetOrder,這個類含有Pet,並且加了一個計數器,沒辦法,只能這樣了。
這邊可以在把dog或者cat 添加進隊列之前就生成PetOrder(見下面的代碼),然後add,也可以通過子類可以賦值給父類這個特點,用Pet作爲函數的參數,然後具體判斷是狗還是貓,進而再new成一個PetOrder,然後再add,這只是具體的實現細節而已,可以自由選擇。
附完整Java代碼(這邊是把Pet類單獨放在一個Java文件,把其餘部分放在另外一個Java文件,但都是在同一個包下面)
package code_180;
import java.util.*;
import java.util.Queue;
public class PetOrder { //由於不能改變原用戶的結構,因此爲了加上計數標籤,又新定義了一個類。
public Pet pet;
public int order;
public PetOrder(Pet pet ,int order) {
this.pet = pet;
this.order = order;
}
public int getOrder() {
return order;
}
public static void main(String[] args) { //Main 函數的測試
// TODO Auto-generated method stub
Pet nowPet;
QueuePet queue = new QueuePet();
for(int i = 1 ;i <=5 ;i++) {
if( i%2 == 1) {
nowPet = new Dog();
queue.add(nowPet, i);
}
else {
nowPet = new Cat();
queue.add(nowPet, i);
}
}
System.out.println();
queue.pollAll();
queue.pollCat();
queue.pollDog();
queue.pollDog();
if(queue.isDogEmpty() )
System.out.println("empty");
else
System.out.println("no empty");
}
}
class QueuePet{ //這就是所謂的貓狗隊列,其實本質就是含有一個狗隊列,一個貓隊列的自定義隊列,還是考查自定義結構的設計
private Queue<PetOrder>dogs;
private Queue<PetOrder>cats;
public QueuePet() { //構造函數
dogs = new LinkedList <PetOrder>();
cats = new LinkedList <PetOrder>();
}
public void add( Pet pet ,int order) { //添加入隊的動物
if(pet.getType().equals("Dog") ) {
System.out.println("now add is a dog,its id is " + order);
dogs.add(new PetOrder(pet,order));
}
else if(pet.getType().equals("Cat")){
System.out.println("now add is a cat, its id is " + order);
cats.add(new PetOrder(pet, order));
}
else
throw new RuntimeException("not dog or cat");
}
public void pollCat() { //彈出當前隊列中最早入隊的貓
if( cats.isEmpty())
throw new RuntimeException("cats empty");
else {
System.out.println("It is a cat,its id is " + cats.peek().order);
cats.poll();
}
}
public void pollDog() { //彈出當前隊列中最早入隊的狗
if(dogs.isEmpty())
throw new RuntimeException("dogs empty");
else {
System.out.println("It is a dog,its id is " + dogs.peek().order);
dogs.poll();
}
}
public void pollAll() { //彈出當前隊列中最早入隊的動物
if(cats.isEmpty() && dogs.isEmpty())
throw new RuntimeException("all empty");
else if(cats.isEmpty()&&!dogs.isEmpty())
pollDog();
else if(!cats.isEmpty()&& dogs.isEmpty())
pollCat();
else {
if(cats.peek().order < dogs.peek().order) {
pollCat();
}
else
pollDog();
}
}
public boolean isEmpty() { // 判斷貓狗是否都爲空
if(cats.isEmpty() && dogs.isEmpty())
return true;
else
return false;
}
public boolean isDogEmpty() { //判斷狗隊列是否爲空
if(dogs.isEmpty())
return true;
else
return false;
}
public boolean isCatEmpty() { //判斷貓是否爲空
if(cats.isEmpty())
return true;
else
return false;
}
}
//1狗,2貓,3狗,4貓,5狗
從這道題學習到的Java知識(也順帶複習了C++知識)
1.
子類中父類部分的構造,必須要通過調用父類的構造函數來完成。如果父類中含有無參構造函數,那麼子類的構造函數會隱式調用,相當於子類的構造函數中有一個隱式的super()語句。
如果父類中沒有無參構造函數,那麼我們必須在子類的構造函數中顯示地調用super(參數), 也就是必須自己手寫語句。
(如果父類中有含參的構造函數,那麼無參的構造函數就不會存在了!!,這點要注意)
附測試代碼:(以下代碼會報錯,請自行修改)
package code_180;
public class AboutSuper {
int num;
AboutSuper(int a){
System.out.println("OK");
}
/*
AboutSuper(){
System.out.println("OK");
}
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
AboutSuper1 test = new AboutSuper1();
}
}
class AboutSuper1 extends AboutSuper{
AboutSuper1(){
super();
//super(3);
}
}
2.
LinkedList 提供了方法支持了Queue的接口,因而可以用LinkedList用作隊列的一種實現
如以下語句 : Queue <Integer> = new LinkedList<Integer>();