隊列

隊列是一個抽象的數據結構,與堆棧有些相似。較對比於棧,隊列打開兩端。 一端總是用來插入數據(排隊),另一個是用來刪除數據(離隊)。 隊列使用先入先出的方法,即,第一存儲的數據項先被訪問。如下:

隊列

隊列中的一個真實的例子可以是單向的車道單行道,其中車輛第一進入,第一離開。更多真實世界的例子可以看出,隊列在售票窗口和巴士站。

隊列表示

正如我們現在知道,在隊列中訪問兩端出於不同的原因,如下圖試圖解釋隊列表示數據結構 -

Queue

與棧,隊列相同,也可以使用數組,鏈表,指針和結構來實現。爲簡單起見,我們將使用一維數組實現隊列。

基本操作

隊列操作可能涉及到初始化或定義隊列,利用它完成從內存中清除它。在這裏,我們將試着去了解使用隊列相關的基本操作 -

  • enqueue() − 添加(存儲)項目到隊列中。

  • dequeue() − 從隊列中刪除(訪問)項目。

很少有更多的功能需要在上述隊列提高操作效率。它們有 -

  • peek() − 獲得在隊列前面的元素而不移除它。

  • isfull() − 檢查隊列是否已滿。

  • isempty() − 檢查隊列是否爲空。

在隊列中,我們總是出隊(或訪問)數據,通過前面的指針,查詢(或存儲)我們把後面的指針的幫助下將隊列中的數據指出。

讓我們先來了解一個隊列的輔助功能 −

peek()

像棧,此功能可以看到在隊列的前部的數據。peek() 函數算法如下 −

begin procedure peek

return queue[front]

end procedure

在C語言中 peek()函數的實現-

int peek() {
return queue[front];
}

isfull()

由於我們使用一維數組實現的隊列,我們只是檢查後指針要達到最大範圍(MAXSIZE),以確定隊列已滿。在情況下,我們保持隊列以循環鏈表的形式,該算法將有所不同。isfull()函數算法如下:

begin procedure isfull

if rear equals to MAXSIZE
return true
else
return false
endif

end procedure

在C語言中的 isfull()函數的實現 -

bool isfull() {
if(rear == MAXSIZE - 1)
return true;
else
return false;
}

isempty()

isEmpty()函數算法 -

begin procedure isempty

if front is less than MIN OR front is greater than rear return true
else
return false
endif

end procedure

如果前面的值小於 MIN 或 0,它告訴隊列尚未初始化,因此空。

下面是C語言編程代碼 -

bool isempty() {
if(front < 0 || front > rear)
return true;
else
return false;
}

入隊操作

由於隊列維護兩個數據指針,前部和後部,其操作比堆棧相對較難實現。

應採取以下步驟來將數據排入隊列(插入)到一個隊列 -

  • Step 1 − 檢查隊列是否已滿

  • Step 2 − 如果隊列已滿,產生溢出錯誤,然後退出

  • Step 3 − 如果隊列未滿,增加尾部指針指向下一個空的空間

  • Step 4 − 添加數據元素到隊列位置,其中後方(rear)指向

  • Step 5 − 返回成功

Insert

有時,我們還要檢查,如果隊列被初始化或不處理任何意外情況。

排入隊列的操作算法

procedure enqueue(data)
if queue is full
return overflow
endif

rear ← rear + 1

queue[rear] ← data

return true

end procedure

排入隊列 enqueue() 函數的 C語言的實現-

int enqueue(int data)
if(isfull())
return 0;

rear = rear + 1;
queue[rear] = data;

return 1;
end procedure

解列操作

從隊列中訪問數據是兩個任務的過程 − 訪問前在這裏指的是所指向的數據,以及訪問後刪除數據。將採取以下步驟來執行解列操作 -

  • Step 1 − 檢查隊列是否爲空

  • Step 2 − 如果隊列爲空,產生溢錯誤,然後退出

  • Step 3 − 如果隊列不爲空,訪問數據,並向前指向

  • Step 3 − 增量前指針指向下一個可用的數據元素

  • Step 5 − 返回成功

Remove

算法解列操作 -

procedure dequeue
if queue is empty
return underflow
end if

data = queue[front]
front ← front - 1

return true
end procedure

出隊列 dequeue() 的C語言實現:

int dequeue() {

if(isempty())
return 0;

int data = queue[front];
front = front + 1;

return data;
}

對於C編程語言的完整隊列程序,請點擊這裏