資料結構之棧 佇列

2021-10-01 06:18:29 字數 1200 閱讀 4447

佇列只允許在同一端進行插入和刪除資料,也是一種線性表結構,後進者先出,先進者後出,是典型的「棧」結構。

相比於陣列和鍊錶,棧只會帶來更多的限制,從功能來說,陣列或者鍊錶完全可以替代棧,為什麼還需要棧呢?

棧把功能縮小使之更加單一,是為了避免暴露太多的操作介面,使用起來更加安全可控,不容易出錯。

棧既可以用陣列來實現,也可以用鍊錶實現,用陣列實現的棧叫順序棧,用鍊錶實現的棧叫鏈式棧

棧的操作複雜度,儲存資料需要乙個大小為n的陣列或鍊錶,不管是入棧或者出棧,空間複雜度都是o(1),時間複雜度也是o(1)。

支援動態擴容的順序棧:

需要在底層實現乙個支援動態擴容的陣列即可。如果需要擴容操作,由於需要陣列擴容,所以時間複雜度會變成o(n)。動態擴容的棧的操作均攤時間複雜度仍未o(1),因為擴容操作比較少,可以均攤至每一次的入棧操作中。

函式呼叫,作業系統呼叫函式時,用棧儲存呼叫時的臨時變數,每進入乙個函式,就將臨時變數作為乙個棧幀入棧,函式執行完成,函式對應的棧幀出棧。

表示式求值,計算機計算表示式的原理是通過棧,確切說是通過兩個棧,乙個用來存放數字,乙個存放運算子,從左向右遍歷表示式,遇到數字壓入運算元字的棧,遇到運算子,就與運算子棧頂元素的優先順序進行比較,如果比棧頂元素優先順序高,就壓入棧,如果低或者相同,就從運算子中取出運算子,從運算元的棧頂取2個運算元,進行計算,再把結果壓入運算元棧,繼續比較。最後清空棧,得出結果。

另外,棧也可用於括號匹配,瀏覽器的前進後退功能也是可以通過棧來實現的。

先進先出,就是典型的佇列。

佇列也只能支援兩個操作,入隊和出隊,入隊是資料放到佇列的尾部,出隊是從佇列頭部去乙個元素。也是線性表結構。

同棧一樣,佇列分為順序佇列和鏈式佇列。佇列的實現,主要是兩個指標,頭指標和尾指標。頭指標和尾指標中間的資料就是佇列的內容。

順序佇列的資料操作會使資料慢慢移動到陣列的最後,需要資料搬移。

基於鍊錶的佇列實現比較類似。為了避免資料搬移可以用迴圈佇列,保證時間複雜度為o(1)。

阻塞佇列和併發佇列應用比較廣泛,阻塞佇列在佇列的基礎上增加了阻塞操作,在隊列為空的時候,取資料會被阻塞,直到佇列中有資料了才能取,如果佇列已滿,那麼插入資料就會被阻塞,直到佇列中有空位才插入,然後再返回。

併發佇列就是在入隊出隊的方法加鎖,同一時刻僅允許乙個存或取操作,基於陣列的迴圈佇列,利用cas原子操作,可以實現非常高效的併發佇列。

資料結構之棧 佇列

棧是一種操作受限的線性表,只允許在一端刪除和新增資料。特定的資料結構是對特定使用場景的抽象,陣列和鍊錶暴露的介面太多,操作靈活自由,但是使用起來不可控,容易出錯。棧可以陣列和鍊錶實現。陣列實現叫做順序棧,鍊錶實現叫做鏈式 棧。儲存資料只需要大小為n的陣列就夠了,出棧和入棧過程中,只需要一兩個臨時變數...

資料結構之棧和佇列

棧 stack 是限定僅在表尾進行插入和刪除操作的線性表。我們把允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 bottom 不含任何資料元素的棧稱為空棧。棧又稱為後進先出 last in first out 的線性表,簡稱lifo結構。棧的插入操作,叫做進棧,也稱壓棧 入棧。類似子彈入彈夾。...

資料結構之棧和佇列

棧是乙個非常常見的資料結構,它在計算機領域中被廣泛的使用,比如作業系統會給每個執行緒分配乙個棧。用來儲存函式呼叫時各個函式的引數,返回值以及臨時變數等。棧的特點是先進後出。通常棧是乙個不考慮排序的資料結構,我們需要o n 時間才能找到棧中的最大值或者最小值,如果想要在o 1 時間內找到棧中的最大值或...