一.何為佇列?
在資料結構中,在有序列表中資料的輸入輸出分別是由不同埠處理的,輸出端稱為前端,輸入端稱為後端,這樣會使得先進入的資料先被取出,即它具有先進先出的特性。
二.佇列都分為那幾類?
我們最常見的佇列有:順序佇列,迴圈佇列,鏈佇列以及雙向佇列;
不過,我們除了必須掌握這幾種常見佇列也要對不常見的佇列進行了解和熟悉,比如說:k佇列,優先佇列和無鎖佇列(此文我們主要研究順序佇列,其他佇列待更新);
三.深入了解各種佇列
1.順序佇列
基本操作的實現:
對於此種佇列,在對其進行結構體設計時有三種設計方法,分別如下:
在利用這個結構體時,有個問題。就是maxsize的取值,我們對元素的多少根本無法預計,假如我們巨集定義時給maxsize的值小,那麼很可能導致在使用的過程中元素的值超過巨集定義值。那麼有人說,那我定義盡可能大些,不是就不會出現這種情況了嗎?當然這種情況是不會出現了,可是會出現另乙個問題,對資源的浪費。假如說我們給maxsize巨集定義的值為1000000,可是我們實際只用了10個那麼剩下的空間豈不是白白浪費了嗎?
基於此結構體的這種缺點,我對其進行了改進,得到下面的結構體b
此結構體我嚴格採用多定少用的原則,完美的彌補了a結構體的缺陷,有些人可能就說那這個結構體相當完美了,可是事實真的是那樣嗎?讓我們接著往下看:
在進行佇列的基本操作求當前佇列的長度時,利用此結構體我們寫出得**如下:
有些人可能說沒問題啊,就3行**我們就求出了長度,可是仔細考慮下,這個**真的沒有需要修改的地方了嗎?
大家有沒有覺得return的語句有點太繁瑣。有些人可能說直接用s.tail-s.front就求出結果了,何必搞得那麼複雜。可是這樣直接求出的結果對嗎?
舉個例子:假如我們有乙個可以存放8個元素的空間,我們給它乙個頭指標front和尾指標tail,如下圖所示:
現在我們有一組資料11,12,13,14,15,要進入這個佇列,那麼在這個過程中是front指標不動,tail指標向後移動,如下圖:
然後我們將這這組資料進行出佇列處理:這個過程是front指標向後移動,tail指標不動,如下圖:
下面如果我們再想進行入佇列操作時,如果在5,6,7號位置直接進行的話,勢必會導致0---4號位置空間資源的浪費。因此,為了更好的對空間資源進行利用,我們就得想乙個辦法讓我們的尾指標tail回到0號位置,此時的位置關係圖如下所示;
此時front指標在5位置,tail指標在0位置,若採用上面的s.tail-s.front計算長
那麼,既然上述結構體也並不是完美的,那麼我們經過考慮得到可以在結構體中加入乙個表示當前元素個數的變數cursize,那麼我們得到的新的結構體就如下:
在加入當前元素個數的變數後,我們對佇列的基本操作的實現就變得比較簡單了,具體操作如下;
#include #include #define queuesize 100
#define true 1
#define false 0
#define ok 1
#define error 0
typedef int status;
typedef int elemtype;
typedef structqueue;
//佇列判空
status queueempty(queue &s)
//求佇列長度
int queuelength(queue &s)
//初始化佇列
status initqueue(queue &s)
//佇列判滿
bool queuefull(queue &s)
//清空佇列
status clearqueue(queue &s)
//取佇列頭元素
status gethead(queue &s,elemtype &x)
//取佇列尾元素
status gettail(queue &s,elemtype &x)
//插入元素x為s的新隊尾元素
status enqueue(queue &s,elemtype x)
//刪除s中隊頭元素,並用e返回其值
status dequeue(queue &s,elemtype &e)
int main()
2.鏈佇列
鏈佇列在構造結構體時如下所示:
具體的基本功能實現類似於順序表的實現。
資料結構 佇列總結
用順序和鏈式實現了線性表,這次要用順序和鏈式實現佇列了。佇列 只允許在一端進行插入操作,而另一端進行刪除操作的線性表。允許插入 入隊 進隊 的一端稱為隊尾,允許刪除 出隊 的一端稱為隊頭。佇列的操作特性 先進先出 順序佇列 佇列的順序儲存結構 假溢位 當元素被插入到陣列中下標最大的位置上之後,佇列的...
資料結構之佇列總結
佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。是一種先進先出 first in first out 的線性表,簡稱fifo。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。迴圈佇列是把佇列頭尾相接的順序儲存結構。通用計算佇列長度的公式 rear front max s...
含淚總結篇 資料結構 佇列
系列文章 什麼是資料結構?什麼是演算法?資料結構 陣列 資料結構 鍊錶 資料結構 棧 資料結構 佇列 資料結構 排序 優勢 陣列或鍊錶暴露了太多的操作介面,不適合特點的場景下的安全和可控情況。實現 用陣列實現的佇列 public class arrayqueue 入隊操作,將 item 放入隊尾 p...