貓狗隊列的實現——Java從0開始學習系列之路(5)

前言---

現在人有點精神,寫篇博客,晚點再去喫飯。人在,博客在!

注:筆者水平有限,若有錯誤,請讀者慷慨指出

 

貓狗隊列

題目:

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>();

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章