1. 程式人生 > >資料結構系列之迴圈佇列

資料結構系列之迴圈佇列

                                        基於陣列的迴圈佇列的Java實現

1、藉助陣列建立一個迴圈佇列類

package 佇列;
/*陣列實現的迴圈佇列*/
public class ArrayQueue {

	private int first,last,maxSize;
	private Object[] storage;
	public ArrayQueue(){
		this(100);
	}
	public ArrayQueue(int n){     //建構函式
		maxSize=n;
		storage=new Object[maxSize];
		first=last=-1;
	}
	public int getLength(){     //取得佇列中有效資料長度
		if(this.isEmpty())
			return 0;
		else if(last>=first)
			return last-first+1;
		else
			return (maxSize-first)+(last-0+1);
	}
	public boolean isFull(){     //判斷是否為滿佇列
		return first==0&&last==maxSize-1||first==last+1;
	}
	public boolean isEmpty(){      //判斷是否為空佇列
		return first==-1;
	}
	public void enqueue(Object e1){  //進佇列操作
		if(this.isEmpty()){        //當佇列為空時
			storage[0]=e1;
			first=last=0;
		}
		else if(!this.isFull()){      //佇列不空且不滿時
		   if(last==maxSize-1){  //當last位於最後一個位置時
				storage[0]=e1;
				last=0;
		   }else
				storage[++last]=e1;
		}
	}
	public Object dequeue(){      //刪除佇列頭元素
		if(!this.isEmpty()){
			Object temp=storage[first];
			if(first==last)      //只有一個元素時
				first=last=-1;
			else if(first==maxSize-1)  //不止一個元素且first位於最後位置時
				first=0;
			else                   //不止一個元素且first不是位於最後位置時
				first++;
			return temp;
		}
		else
			return null;
	}
	public void printAll(){
		if(!this.isEmpty()){
			if(last>=first){//當first小於last時正常列印
				for(int i=first;i<=last;i++)
					System.out.print(storage[i]+" ");
			}
			else{//當first大於last時分兩次列印,先列印first到maxSize-1;再列印0到last
				for(int i=first;i<maxSize;i++)
					System.out.print(storage[i]+" ");
				for(int j=0;j<last+1;j++)
					System.out.print(storage[j]+" ");
			}
		}
		else
			System.out.print("佇列已空!");
	}
}

2、建立測試類
package 佇列;

public class Test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ArrayQueue q=new ArrayQueue(3);
		q.enqueue(2);
		System.out.println("佇列此時長度為:"+q.getLength());   //1
		q.enqueue(1);
		System.out.println("佇列此時長度為:"+q.getLength());    //2
		q.enqueue(4);//3
		q.dequeue();//2
		System.out.println("佇列此時長度為:"+q.getLength());  //2
		q.dequeue();
		System.out.println("佇列此時長度為:"+q.getLength());    //1
		q.dequeue();//0
		q.enqueue(4);
		System.out.println("佇列此時長度為:"+q.getLength());//1
		q.printAll();
	}

}

3、測試結果
佇列此時長度為:1
佇列此時長度為:2
佇列此時長度為:2
佇列此時長度為:1
佇列此時長度為:1
4