1. 程式人生 > >Java實現順序佇列

Java實現順序佇列

佇列-操作受限的線性表。進行刪除的一端叫隊頭,進行插入的一端叫隊尾。

順序佇列用順序儲存。刪除隊首元素有兩種方式:

①不要求隊首元素必須在下標為零的陣列元素中;

每次刪除元素只需修改隊首指標的位置,令front=front+1;顯然優點為無須改變佇列元素的位置,缺點為front值隨刪除元素而不斷增加,整個佇列向後移動,隨著隊尾元素的不斷插入,必然會導致陣列後端沒有可用空間的情況,而陣列前端的大量空間卻被閒置。

②要求隊首元素必須在下標為零的陣列元素中;

每次刪除隊首元素,令所有元素元素向前移動一個位置,顯然優點為不浪費空間,缺點為所有元素的地址都要改變,效率低。

為了克服以上缺點,假定陣列是迴圈的,即採用環狀模型來實現佇列。即將佇列在邏輯上置於一個圓環上:

刪除,front順時針移動一個位置;

插入,rear順時針移動一個位置;

環狀佇列實現要求餘運算:

rear=(rear+1)%size;

front=(front+1)%size;

程式碼:

public class AQueue<T> {
	/**
	 * 隊首所在陣列元素的下標
	 */
	private int front;
	/**
	 * 隊尾所在陣列元素的下標
	 */
	private int rear;
	/**
	 * 隊中元素的個數
	 */
	private int count;
	/**
	 * 存放佇列元素的陣列
	 */
	private Object[] queueArray;
	/**
	 * 陣列的規模
	 */
	private int size;
	/**
	 * 構造方法
	 */
	public AQueue(){
		this.size=10;
		this.queueArray=new Object[size];
		front=0;
		rear=0; 
		count=0;
	}
	/**
	 * 構造方法
	 * @param size 陣列大小
	 */
	public AQueue(int size){
		this.size=size;
		this.queueArray=new Object[size];
		front=0;
		rear=0; 
		count=0;
	}
	/**
	 * 判斷是否已滿
	 * @return
	 */
	public boolean isFull(){
		return count==size;
	}
	/**
	 * 判斷是否為空
	 * @return
	 */
	public boolean isEmpty(){
		return count==0;
	}
	/**
	 * 在隊尾插入data為item的元素
	 * @param item 資料域
	 * @return 成功返回true
	 */
	public boolean insert(T item){
		if(isFull()){
			System.out.println("full queue");
			return false;
		}
		queueArray[rear]=item;
		rear=(rear+1)%size;//修改隊尾指標
		count++;
		return true;
	}
	/**
	 * 刪除隊首元素
	 * @return 返回隊首元素值
	 */
	public T delete(){
		if(isEmpty()){
			throw new RuntimeException("empty queue");
		}
		T item=(T)queueArray[front];
		front=(front+1)%size;
		count--;
		return item;
	}
	/**
	 * 得到隊首元素值
	 * @return
	 */
	public T getFront(){
		if(isEmpty()){
			throw new RuntimeException("empty queue");
		}
		return (T)queueArray[front];
	}
	/**
	 * 清空佇列
	 */
	public void clear(){
		front=rear=count=0;
	}
	//測試
	public static void main(String[] args){
		AQueue<Integer> aqueue=new AQueue<Integer>();
		aqueue.insert(1);  
		aqueue.insert(2); 
		aqueue.insert(3); 
		aqueue.insert(4); 
		aqueue.delete();
		System.out.println(aqueue.getFront());
		aqueue.delete();
		System.out.println(aqueue.getFront());
		aqueue.delete();
		System.out.println(aqueue.getFront());
		aqueue.delete();
		System.out.println(aqueue.getFront());
	}
}