棧和佇列資料儲存型別---佇列(簡單瞭解)
阿新 • • 發佈:2019-02-15
引言
前面介紹了棧資料儲存型別,下面接著介紹佇列資料儲存型別。佇列和棧一樣也被用作程式設計師的工具。佇列也是一種資料結構,有點類似棧,只是在佇列中第一個插入的資料項也會最先被移除,先進先出。佇列的作用就像人們排隊買東西,第一個排隊的人對於後面的人來說就是隊頭,隊伍最後一個人對於整個隊伍來說就是隊尾。
現實排隊中,當前一個人買完東西離開隊伍後,其他人都向前移動。但是在計算機中,雖然也可以刪除一個隊頭的資料項,後面的資料項都向前移動,但是這樣效率很差。所以我們加入隊頭和隊尾的座標指標,是指標移動來保持所有的資料項位置不變,來區分隊頭和隊尾。
這樣會出現,隊尾的指標已經不能向後移動,但是隊頭的資料已經移除,佇列不滿但是不能插入新的資料項問題。所以為了避免佇列不滿去不能插入新資料項問題,可以讓隊頭隊尾指標環繞到陣列開始的位置。這就是迴圈佇列。
/** * 簡單佇列 * @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指標取一定的位置,但是當佇列為空時,也可能呈現相同的位置關係。於是在同一時間,佇列似乎可能是滿的,也可能是空的。所以需要讓陣列的容量比佇列資料項個數的最大值還要大一。