棧和隊列

棧和隊列

(stack)是一個先進後出的(LIFO)的線性表,只能在表尾進行插入和刪除工作。
棧的插入push和刪除pop
棧的順序存儲和鏈式存儲結構
在這裏插入圖片描述
順序存儲的棧包含了三個元素:base, top, stacksize。即棧底指針,棧頂指針和當前最大容量。
出棧是在棧頂取出數據,top-1,彈出一個數據,棧長也-1.
入棧是在棧頂加數據,top+1,棧長+1
注意:棧底的第一位爲0,如果是空棧,top=-1,因爲top是指向棧頂最後一位的上一位。

銷燬棧和清空棧不同:銷燬是要釋放這個棧佔據的物理內存空間

逆波蘭
後綴中綴
逆波蘭漫畫

中綴表達式轉後綴表達式規律:從左到右遍歷中綴表達式的每一個數字和符號,數字直接輸出,若是符號要判斷它與棧頂符號的優先級,是右括號或者優先級低於棧頂符號,則棧頂符號依次出棧並輸出。直到遇到左括號或者優先級更高的符號才入棧。

隊列
queue 只允許在一段進行刪除操作,在另一端進行插入操作的線性表,先進先出FIFO。有兩個指針,一個指向隊頭一個指向隊尾。頭結點不是必要的,但是有的話更方便。
在這裏插入圖片描述
隊列的鏈式存儲結構
棧一般用順序表來實現,但是隊列一般用鏈表來實現,簡稱鏈隊列。
在這裏插入圖片描述
空表
在這裏插入圖片描述
入隊列操作過程,插入e2
在這裏插入圖片描述
出隊列操作,移出e1
將隊列的第一個元素移出,對頭指針不發生變化,改變頭結點的next指針即可。
棧:插進去抽出來
隊列:插進去吐出來
在這裏插入圖片描述
特殊情況:原隊列只有一個元素,就要處理隊尾指針。
在這裏插入圖片描述
銷燬隊列
鏈隊列建立在內存的動態區,因此,隊列不再有用的時候要及時釋放掉。

隊列的順序存儲結構
假設有n個元素,則要建立一個大於n的存儲單元,把隊列的所有結構儲存到前n個單元,數組下標爲0的是隊頭
入隊容易,出隊難,因爲所有元素都要向前移動,複雜度O(n)
在這裏插入圖片描述
如果對頭指針可以靈活運用,不限制指向下標0,就解決了複雜度問題了在這裏插入圖片描述
但是會出現假溢出的情況

可以用循環隊列來解決這個問題,後面滿了就從頭填充,形成首位相接的環。
隊列的循環鏈表演示 rear和front都會改變。他們的指針不斷加一,即使超過也可以重頭開始。應用取模算法解決假溢出,就是取餘數,餘數永遠不會大於除數。

(rear+1)/棧長
(front+1)/棧長
在這裏插入圖片描述結合動畫考慮,rear和front重合就說明棧滿了在這裏插入圖片描述

發佈了27 篇原創文章 · 獲贊 0 · 訪問量 487
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章