1. 程式人生 > >棧和佇列資料儲存型別---佇列(簡單瞭解)

棧和佇列資料儲存型別---佇列(簡單瞭解)

引言

    前面介紹了棧資料儲存型別,下面接著介紹佇列資料儲存型別。佇列和棧一樣也被用作程式設計師的工具。佇列也是一種資料結構,有點類似棧,只是在佇列中第一個插入的資料項也會最先被移除,先進先出。佇列的作用就像人們排隊買東西,第一個排隊的人對於後面的人來說就是隊頭,隊伍最後一個人對於整個隊伍來說就是隊尾。

    現實排隊中,當前一個人買完東西離開隊伍後,其他人都向前移動。但是在計算機中,雖然也可以刪除一個隊頭的資料項,後面的資料項都向前移動,但是這樣效率很差。所以我們加入隊頭和隊尾的座標指標,是指標移動來保持所有的資料項位置不變,來區分隊頭和隊尾。

    這樣會出現,隊尾的指標已經不能向後移動,但是隊頭的資料已經移除,佇列不滿但是不能插入新的資料項問題。所以為了避免佇列不滿去不能插入新資料項問題,可以讓隊頭隊尾指標環繞到陣列開始的位置。這就是迴圈佇列。

/**
 * 簡單佇列
 * @author whmAdmin
 *
 */
public class Queue {

	private int maxSize;	//最大元素數量
	private long[] queArray;// 佇列陣列
	private int front;//隊頭位置
	private int rear;//隊尾位置
	private int nItems;// 當前資料項個數
	
	/**
	 * 初始化佇列
	 * @param s 佇列大小
	 */
	public Queue(int s) {
		maxSize = s;
		queArray = new long[maxSize];
		front = 0;
		rear = -1;
		nItems = 0;
	}
	
	/**
	 * 佇列插入元素
	 * @param j 元素
	 */
	public void insert(long j){
		if(rear == maxSize - 1) {
			rear = -1;
		}
		queArray[++rear] = j;
		nItems++;
	}
	
	/**
	 * 刪除元素
	 * @return
	 */
	public long remove() {
		long temp = queArray[front++];
		if(front == maxSize) {
			front = 0;
		}
		nItems--;
		return temp;
	}
	
	//獲取當前頭元素
	public long peekFront() {
		return queArray[front];
	}
	
	public boolean isEmpty() {
		return (nItems == 0);
	}
	
	public int size() {
		return nItems;
	}
	
	public static void main(String[] args) {
		Queue queue = new Queue(6);
		
		queue.insert(10);
		queue.insert(20);
		queue.insert(30);
		queue.insert(40);
		queue.insert(50);

		queue.remove();
		queue.remove();
		queue.remove();
		
		queue.insert(60);
		queue.insert(70);
		queue.insert(80);
		queue.insert(90);
		
		while (!queue.isEmpty()) {
			long n = queue.remove();
			System.out.print(n);
			System.out.print(" ");
		}
		System.out.println("");
	}
}

執行結果:

40 50 60 70 80 90 
    但是這樣還會出現,當佇列滿的時候,front和rear指標取一定的位置,但是當佇列為空時,也可能呈現相同的位置關係。於是在同一時間,佇列似乎可能是滿的,也可能是空的。所以需要讓陣列的容量比佇列資料項個數的最大值還要大一。