1. 程式人生 > >java中隊列實現

java中隊列實現

col 出隊 基本操作 blog 現象 重要 alt else get

隊列的定義:

隊列(Queue)是只允許在一端進行插入,而在另一端進行刪除的運算受限的線性表。

技術分享

(1)允許刪除的一端稱為隊頭(Front)。

(2)允許插入的一端稱為隊尾(Rear)。
(3)當隊列中沒有元素時稱為空隊列。
(4)隊列亦稱作先進先出(First In First Out)的線性表,簡稱為FIFO表。
隊列的修改是依先進先出的原則進行的。新來的成員總是加入隊尾,每次離開的成員總是隊列頭上的(不允許中途離隊)。

隊列的存儲結構及實現

隊列的順序存儲結構

(1) 順序隊列的定義:

隊列的順序存儲結構稱為順序隊列,順序隊列實際上是運算受限的順序表。

(2)順序隊列的表示:

和順序表一樣,順序隊列利用內存中一段連續的存儲空間來存放當前隊列中的元素。
由於隊列的隊頭和隊尾的位置是變化的,設置兩個指針front和rear分別指示隊頭元素和隊尾元素,它們的初值在隊列初始化時均應置為0。

技術分享

(3)順序隊列的基本操作

 1 public class JavaDemo<E> {
 2     E[] a;
 3     // 默認初始化大小
 4     private static final int DEFAULT_SIZE = 10;
 5     // 對首下標
 6     int front;
 7     // 隊尾下標
 8     int rear;
 9 
10     public JavaDemo() {
11         this(DEFAULT_SIZE);
12     }
13 
14     /**
15      * 初始化指定長度的隊列
16
* @author Baorant 17 * @param size 18 */ 19 @SuppressWarnings("unchecked") 20 public JavaDemo(int size) { 21 a = (E[]) (new Object[size]); 22 front = 0; 23 rear = 0; 24 } 25 26 /** 27 * 將一個對象追加到隊列尾部 28 * 29 * @param obj 30 * @return
隊列滿時返回false,否則返回true 31 * @author Baorant 32 */ 33 public boolean enqueue(E obj) { 34 if ((rear + 1) % a.length == front) { 35 return false; 36 } else { 37 a[rear] = obj; 38 rear = (rear + 1) % a.length; 39 return true; 40 } 41 } 42 43 /** 44 * 隊列頭部出隊 45 * 46 * @return 47 * 48 */ 49 public E dequeue() { 50 if (rear == front) 51 return null; 52 else { 53 E obj = a[front]; 54 front = (front + 1) % a.length; 55 return obj; 56 } 57 } 58 59 /** 60 * 隊列長度 61 * @author Baorant 62 * @return 63 * 64 */ 65 public int size() { 66 return (rear - front) % a.length; 67 } 68 69 // 隊列長度(另一種方法) 70 public int length() { 71 if (rear > front) { 72 return rear - front; 73 } else 74 return a.length - 1; 75 } 76 77 /** 78 * 判斷是否為空 79 * @author Baorant 80 * @return @ 81 */ 82 public boolean isEmpty() { 83 return rear == front; 84 } 85 86 public static void main(String[] args) { 87 JavaDemo<String> queue = new JavaDemo<String>(4); 88 queue.enqueue("1"); 89 queue.enqueue("2"); 90 queue.enqueue("3"); 91 queue.enqueue("4"); 92 System.out.println("size = " + queue.size()); 93 int size = queue.size(); 94 System.out.println("*******出棧操作*******"); 95 for (int i = 0; i < size; i++) { 96 System.out.print(queue.dequeue() + " "); 97 } 98 } 99 }


入隊時:將新元素插入rear所指的位置的後一位。
出隊時:刪去front所指的元素,然後將front加1並返回被刪元素。

(4)順序表的溢出現象

①“下溢”現象
當隊列為空時,做出隊運算產生的溢出現象。“下溢”是正常現象,常用作程序控制轉移的條件。

② "真上溢"現象
當隊列滿時,做進棧運算產生空間溢出的現象。“真上溢”是一種出錯狀態,應設法避免。

③ "假上溢"現象
由於入隊和出隊操作中,頭尾指針只增加不減小,致使被刪元素的空間永遠無法重新利用。當隊列中實際的元素個數遠遠小於內存中本分配的空間時,也可能由於尾指針已超越向量空間的上界而不能做入隊操作。該現象稱為"假上溢"現象。如下圖

技術分享

循環隊列:

如上圖所示,這種頭尾相接的順序存儲結構稱為循環隊列(circular queue)。

循環隊列中需要註意的幾個重要問題:

①隊空的判定條件,隊空的條件是front=rear;

②隊滿的判定條件,(rear+1)%QueueSize=front。QueueSize為隊列初始空間大小。

循環隊列的java實現代碼

java中隊列實現