標籤:迴圈隊列
用java實現迴圈隊列的方法:
1、增加一個屬性size用來記錄目前的元素個數。目的是當head=rear的時候,通過size=0還是size=數組長度,來區分隊列為空白,或者隊列已滿。
2、數組中只儲存數組大小-1個元素,保證rear轉一圈之後不會和head相等,也就是隊列滿的時候,rear+1=head,中間剛好空一個元素。
當rear=head的時候,一定是隊列空了。
隊列(Queue)兩端允許操作的類型不一樣:
可以進行刪除的一端稱為隊頭,這種操作也叫出隊dequeue;
可以進行插入的一端稱為隊尾,這種操作也叫入隊enqueue。
隊列的
實現隊列時,要注意的是假溢出現象,如的最後一幅圖。
的假溢出現象
解決辦法:使用鏈式儲存,這顯然可以。在順序儲存時,我們常見的解決辦法是把它首尾相接,構成迴圈隊列,這可以充分利用隊列的儲存空間。
迴圈隊列:
在中,front指向隊列中第一個元素,rear指向隊列隊尾的下一個位置。
但依然存在一個問題:當front和rear指向同一個位置時,這代表的是隊空還是隊滿呢?大家可以想象下這種情景。
解決這種問題的常見做法是這樣的:
使用一標記,用以區分這種易混淆的情形。
犧牲一個元素空間。當front和rear相等時,為空白;當rear的下一個位置是front時,為滿。
如:
下面我們給出迴圈隊列,並採用第二種方式,即犧牲一個元素空間來區分隊空和隊滿的代碼.
幾個重點:
1、front指向隊頭,rear指向隊尾的下一個位置。
2、隊為空白的判斷:front==rear;隊為滿的判斷:(rear+1)%MAXSIZE==front。
import java.io.*; public class QueueArray { Object[] a; //對象數組,隊列最多儲存a.length-1個對象 int front; //隊首下標 int rear; //隊尾下標 public QueueArray(){ this(10); //調用其它構造方法 } public QueueArray(int size){ a = new Object[size]; front = 0; rear =0; } /** * 將一個對象追加到隊列尾部 * @param obj 對象 * @return 隊列滿時返回false,否則返回true */ public boolean enqueue(Object obj){ if((rear+1)%a.length==front){ return false; } a[rear]=obj; rear = (rear+1)%a.length; return true; } /** * 隊列頭部的第一個對象出隊 * @return 出隊的對象,隊列空時返回null */ public Object dequeue(){ if(rear==front){ return null; } Object obj = a[front]; front = (front+1)%a.length; return obj; } public static void main(String[] args) { QueueArray q = new QueueArray(4); System.out.println(q.enqueue("張三")); System.out.println(q.enqueue("李斯")); System.out.println(q.enqueue("趙五")); System.out.println(q.enqueue("王一"));//無法入隊列,隊列滿 for(int i=0;i<4;i++){ System.out.println(q.dequeue()); } } }
Java數組實現迴圈隊列的兩種方法