隊列
隊列是一個抽象的數據結構,與堆棧有些相似。較對比於棧,隊列打開兩端。 一端總是用來插入數據(排隊),另一個是用來刪除數據(離隊)。 隊列使用先入先出的方法,即,第一存儲的數據項先被訪問。如下:
隊列中的一個真實的例子可以是單向的車道單行道,其中車輛第一進入,第一離開。更多真實世界的例子可以看出,隊列在售票窗口和巴士站。
隊列表示
正如我們現在知道,在隊列中訪問兩端出於不同的原因,如下圖試圖解釋隊列表示數據結構 -
與棧,隊列相同,也可以使用數組,鏈表,指針和結構來實現。爲簡單起見,我們將使用一維數組實現隊列。
基本操作
隊列操作可能涉及到初始化或定義隊列,利用它完成從內存中清除它。在這裏,我們將試着去了解使用隊列相關的基本操作 -
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 − 返回成功
有時,我們還要檢查,如果隊列被初始化或不處理任何意外情況。
排入隊列的操作算法
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 − 返回成功
算法解列操作 -
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編程語言的完整隊列程序,請點擊這裏