棧及其應用

2022-08-01 01:36:13 字數 2150 閱讀 1163

**:

棧又稱堆疊,是一種運算受限的線性表,其限制是僅允許在表的一端進行插入和刪除運算。

把對棧進行運算的一端稱為棧頂,另一端稱為棧底。

向乙個棧插入新元素稱為入棧或進棧,push;從乙個棧刪除元素稱為退棧或出棧,pop。

因為後進棧的元素必定先出棧,所以又把棧稱為後進先出表(last in first out, lifo)。

棧的順序儲存結構需要使用乙個陣列和乙個整型變數來實現。利用陣列來順序儲存棧中的所有元素,利用整型變數來儲存棧頂元素的下標位置,可這個變數稱為棧頂指標。

可以定義如下:

const

int maxsize = 50

;struct

stack

;

若要對儲存棧的陣列空間採用動態分配,則可定義如下:

struct

stack

;

top的值為-1表示棧空。

棧的鏈式儲存結構

棧的鏈式儲存結構是通過由結點構成的單鏈表實現的,此時表頭指標被稱為棧頂指標,由棧頂指標指向的表頭結點被稱為棧頂結點,整個單鏈表被稱為鏈棧。

對鏈棧的插入和刪除操作是在單鏈表的表頭進行的。

當向乙個鏈棧插入元素時,是把該元素插入到棧頂,即,使該元素結點的指標域指向原來的棧頂結點,而棧頂指標則修改為指向該元素結點,使該結點成為新的棧頂結點。

1.輸入,之後逆序輸出。

2.語法檢查:括號匹配。

每當掃瞄到大中小的左括號後,令其進棧,當掃瞄到右括號時,則檢查棧頂是否為相應的左括號,若是則退棧處理,若不是則出現了語法錯誤。當掃瞄到檔案結尾,若棧為空則表明沒有發現括號配對錯誤。

3.數制轉換:把十進位制的整數轉換為二至九之間的任一進製數輸出。

轉換方法:要轉換為r進製,則原來的數逐次除以基數r(除完之後用商再除),直到商為0,得到的一系列餘數的逆序就是轉換結果。

中綴表示式(就是我們人類通常寫的算術表示式)中,計算需要注意優先順序、括號這些問題,和運算子的實際運算次序往往同它們在表示式中的先後次序不一致,所以波蘭科學家提出了字尾表示式,把運算子放在兩個運算物件的後面。

在字尾表示式中看,不存在括號,也不存在運算子優先順序的差別,計算過程完全按照運算子出現的先後次序進行,整個計算過程僅需掃瞄一遍便可完成。

中綴表示式轉換成字尾表示式:

中綴算術表示式轉換成對應的字尾算術表示式的規則是:把每個運算子都移到它的兩個運算物件的後面,然後刪除掉所有的括號即可。

為了轉換正確,必須設定乙個運算子棧,並在棧底放入乙個特殊算符,假定為@,讓它具有最低的運算子優先順序,此棧用來儲存掃瞄中綴表示式得到的暫不能放入字尾表示式中的運算子,待它的兩個運算物件都放入到字尾表示式之後,再令其出棧並寫入到字尾表示式中。

轉換過程如下:從頭到尾掃瞄中綴表示式,若遇到數字則直接寫入字尾表示式,若遇到運算子,則比較棧頂元素和該運算子的優先順序,當該運算子的優先順序大於棧頂元素的時候,表明該運算子的後乙個運算物件還沒有進入字尾表示式,應該把該運算子暫存於運算子棧中,然後把它的後乙個運算物件寫入到字尾表示式中,再令其出棧並寫入字尾表示式中;若遇到的運算子優先順序小於等於棧頂元素的優先順序,表明棧頂運算子的兩個運算物件已經被寫入字尾表示式,應將棧頂元素出棧並寫入字尾表示式,對於新的棧頂元素仍進行比較和處理,直到棧頂元素的優先順序小於當前等待處理的運算子的優先順序為止,然後令該運算子進棧即可。

按照上述過程掃瞄到中綴表示式的末尾,把剩餘的運算子依次出棧並寫入字尾表示式即可。

(對於左括號直接進棧,右括號則使左右兩個括號內的運算子都出棧)。

字尾表示式求值

字尾表示式求值也需要乙個棧,其元素型別為運算元的型別,此棧儲存字尾表示式中的運算元、計算過程的中間結果及最後結果。

計算過程如下:掃瞄字尾表示式,若遇到運算元則進棧,若遇到操作符則彈出兩個運算元進行計算,然後將結果壓進棧,直到最後掃瞄完畢,棧中應該儲存著最終結果。

在計算機系統內,執行遞迴函式是通過自動使用棧來實現的,棧中的每個元素包含有遞迴函式的引數域、每個區域性變數域和呼叫後的返回位址域,其中引用引數域只儲存傳送來的實參的位址。

每次進行函式呼叫,都把相應的值壓入棧,每次呼叫結束,都按照本次返回位址返回到指定位置執行,並且自動做一次退棧操作。

關於遞迴的應用就又是乙個大話題了,此處就不多說了。

棧及其簡單應用

棧是一種特殊的線性表 是一種先進後出表 filo 只有棧頂元素才能被操作 特殊 棧具有特殊的儲存訪問結構 棧的操作 入棧 向棧中儲存資料元素 push 出棧 從棧中取出元素 pop 棧頂指標 top 用來指向最後乙個入棧元素 棧滿 上溢 不可入棧 top size 1 入棧操作 top top 1 ...

棧操作及其應用

棧可以是順序棧,也可以是鏈棧。順序棧 1 const int maxsize 100 2 順序棧 3struct sqstack78 void initstack sqstack s 912 13int isempty sqstack s 1420 21int push sqstack s,int ...

單調棧結構及其應用

單調棧 解決乙個陣列中,對於每個數,求左邊離它最近的比它大 小 的數,右邊離它最近的比它大 小 的數,時間複雜度o n 實現。1.乙個陣列可化為乙個直方圖,陣列內數值代表該位置的高度 邊長為1的小正方形的個數 求這個直方圖可以形成的最大矩形面積 即小正方形個數 int maxrecfrombotto...