大話資料結構4之棧與佇列

2022-09-16 09:54:12 字數 2108 閱讀 9087

1. 棧是限定僅在表尾進行插入和刪除操作的線性表。

佇列是只允許在一端進行插入操作、而在另一端進行刪除操作的線性表。

2.我們把允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何資料元素的棧稱為空棧。棧又稱為後進先出的線性表,簡稱lifo結構。

棧的插入操作,叫做進棧,也稱壓棧、入棧。push

棧的刪除操作,也叫出棧,也有的叫作彈棧。pop

3.棧的順序儲存結構

進棧操作push

出棧操作pop

時間複雜度均為o(1)

4.兩棧共享空間

針對兩個具有相同資料型別的棧的乙個設計上的技巧,使用該資料結構,通常都是當兩個棧的空間需求有相反關係時,也就是乙個棧增長時另乙個棧在縮短的情況。

用乙個棧儲存兩個陣列,關鍵思路是在陣列兩端向中間靠攏。

5.棧的鏈式儲存結構(簡稱鏈棧)

棧頂放在單鏈表的頭部,不需要頭指標(變成棧頂指標)和頭結點。

對於鏈棧來說,基本不存在棧滿的情況,除非記憶體已經沒有可以使用的空間。

對於空棧來說,鍊錶原定以是頭指標指向空,那麼鏈棧的空其實就top=null的時候。

進棧push出棧pop,時間復度均為o(1)

如果棧的使用過程中元素的變化不可預料,有時很大有時很小,最好使用鏈棧,反之,如果他的變化在可控範圍內,建議使用順序棧會更好一些。

6.棧的作用

棧的引入簡化了程式設計的問題,劃分了不同關注層次,使得思考範圍縮小,更加聚焦於我們要解決的問題核心。所以現在的許多高階語言j**a c#等都有對棧結構等封裝,可以不用關注他的實現細節,可直接使用stack的push和pop方法,非常方便。

7.棧的應用--遞迴(斐波那契的遞迴函式)

把乙個直接呼叫自己或通過一系列的呼叫語句間接的呼叫自己的函式,稱作遞迴函式。

每個遞迴定義必須至少有乙個條件,滿足時遞迴不再進行,即不再引用自身而是返回值退出。

迭代和遞迴的區別是:迭代使用的是迴圈結構,遞迴使用的是選擇結構。

在前行階段,對於每一層遞迴,函式的區域性變數、引數值以及返回位址都被壓入棧中。在退回階段,位於棧頂的區域性變數、引數值、以及返回位址被彈出,用於返**用層次中執行**的其餘部分,也就是恢復了呼叫的狀態。

8.棧的應用--四則運算表示式求值

一種不需要括號的字尾表達法,也稱為逆波蘭(reverse polish notation ,rpn)表示。

9+(3-1) *3+10/2(標準四則運算表示式,中綴表示式)。 字尾表示式為: 9 3 1 -3 * +10 2 / +

叫字尾的原因在於所有的符號都是在要運算數字的後面出現。

運算規則:從左到右遍歷表示式的每個數字和符號,遇到是數字就進棧,遇到是符號就將處於棧頂兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果。

中綴表示式轉化為字尾表示式規則:--

要讓計算機具有處理我們通常標準(中綴)表示式的能力,最重要的兩步:

1.將中綴表示式轉化為字尾表示式(棧用來進出運算的符號)

2.將字尾表示式進行運算得出結果(棧用來進出運算的數字)

9.佇列

佇列(queue)是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。

佇列是一種先進先出的線性表,簡稱fifo.允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。

10.迴圈佇列

佇列的順序儲存結構,為避免當只有乙個元素時,隊頭和隊尾重合使處理變得麻煩,所以引入兩個指標,front指標指向隊頭元素,rear指標指向隊尾元素的下乙個位置,這樣當front等於rear 時,此佇列不是還剩下乙個元素,而是空佇列。會出現「假溢位」的現象

解決假溢位的辦法就是後面滿了,就再重頭開始,也就是頭尾相接的迴圈。我們把佇列的這種頭尾相接的順序儲存結構稱為迴圈佇列。

單是順序儲存,若不是迴圈佇列,演算法的時間效能是不高的,但迴圈佇列又面臨著陣列可能會溢位的問題。所以需要研究不需要擔心佇列長度的鏈式儲存結構。

11.佇列的鏈式儲存結構:就是線性表的單鏈表,不過它只能尾進頭出,簡稱為鏈佇列。

在佇列長度最大值的情況下,建議使用迴圈佇列,如果你無法預估佇列的長度時,則用鏈佇列。

棧                 佇列

順序棧             順序佇列

兩棧共享空間     迴圈佇列

鏈棧               鏈佇列

大話資料結構 棧與佇列

文章知識點來至於大話資料結構裡邊章節知識,這篇主要介紹棧與佇列在計算機中儲存形式,以及在某些演算法領域中對棧和佇列的相關應用。章節最後介紹了著名的逆波蘭表示式,以及通過演算法來實現該表示式的運算過程。在實現 的同時新增了流程圖。相關 原始碼請檢視文章最後。1 棧結構定義 2 棧的順序儲存 3 兩棧共...

《大話資料結構》第4章 棧與佇列

棧與佇列 棧 佇列都是特殊的線性表 受限表 只不過對插入和刪除操作做了限制 沒有修改操作 這些操作只能限制在表的一端 what棧 棧是限定僅在表尾 這裡的表尾是指棧頂,而不是棧底 進行插入和刪除操作的線性表 what佇列 佇列是只允許在表的一端進行插入操作,而在表的另一端進行刪除操作的線性表 棧 佇...

《大話資料結構》第4章 棧與佇列

我們把乙個直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式,稱做遞迴函式 版本1 迭代版本 func fbi1 i int int return arr i 版本2 遞迴版本 func fbi2 i int int 迭代使用的是迴圈結構,遞迴使用的是選擇結構遞迴使程式的結構更清晰 更簡潔 更容...