讓程式設計改變世界
change the world by program
講完了棧的順序儲存結構,也給大家結合了一些例題演練,相信大家對棧再也不陌生了吧?
現在我們來看下棧的鏈式儲存結構,簡稱棧鏈。(通常我們用的都是棧的順序儲存結構儲存,鏈式儲存我們作為乙個知識點,大家知道就好!)
棧因為只是棧頂來做插入和刪除操作,所以比較好的方法就是將棧頂放在單鏈表的頭部,棧頂指標和單鏈表的頭指標合二為一。
no pic you say a j8……
teypedef struct stacknode
stacknode, *linkstackptr;
teypedef struct linkstack
對於棧鏈的push操作,假設元素值為e的新結點是s,top為棧頂指標,我們得到如下**:
status push(linkstack *s, elemtype e)
至於鏈棧的出戰pop操作,假設變數p用來儲存要刪除的棧頂結點,將棧頂指標下移一位,最後釋放p即可。
status pop(linkstack *s, elemtype *e)
在講解這道例題的時候,請允許小甲魚花一點點的時間對小學時候的數學老師進行感謝,嗯,謝謝您,讓我學會如何計算以下這道表示式,並且認為它十分簡單:(1-2)*(4+5)
人類早就熟悉這種中綴表示式的計算方式,隨便拉乙個小朋友過來,給他一顆糖,他會馬上告訴你這個結果應該是等於-9,因為括號裡邊的要先進行計算。
但是計算機不喜歡了,因為我們有小括號中括號大括號,還允許乙個巢狀乙個,這樣子計算機就要進行很多次if判斷才行決定**先計算。
後來,在20世紀三十年代,波蘭邏輯學家jan.lukasiewicz不知道是像牛頓一樣被蘋果砸到腦袋而想到萬有引力原理,或者還是像阿基公尺德泡在浴缸裡突發奇想給皇冠是否純金做驗證,總之他也是靈感閃現了,然後發明了一種不需要括號的字尾表示式,我們通常把它稱為逆波蘭表示式(rpn) 。
很多魚油好奇為什麼他發明的東西是以他的國籍而不是以他的名字命名的呢?這也告訴我們,想要流芳百世,名字還得起得朗朗上口才行。
我們先來看看,對於(1-2)*(4+5),如果用逆波蘭表示法,應該是這樣:1 2 – 4 5 + *
這種方式敢情我們人類是不大好接受的了,不過對於計算機來說,那可是喜愛至極。
因為只需要利用棧的特點,就可以將這種字尾表示式的效能發揮到極致。
解析來就讓小甲魚**並茂的解釋一下吧!
no pic you say a j8……
數字1和2進棧,遇到減號運算子則彈出兩個元素進行運算並把結果入棧。
逆波蘭計算法
4和5入棧,遇到加號運算子,4和5彈出棧,相加後將結果9入棧。
逆波蘭計算法
然後又遇到乘法運算子,將9和-1彈出棧進行乘法計算,此時棧空並無資料壓棧,-9為最終運算結果!
逆波蘭計算法
**:
資料結構與演算法 4棧和佇列
棧的定義 棧 stack 又稱堆疊,它是運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除操作,不允許在其他任何位置進行插入,刪除,查詢等操作。表中進行插入,刪除操作的一端稱為棧頂 top 棧頂儲存的元素稱為 棧頂元素。相對的,表另一端稱為棧底 botton 佇列定義 佇列 queue 簡稱佇...
資料結構 筆記4 棧和佇列
棧 stack 是限定在表的一端進行插入和刪除運算的線性表。插入,刪除的一段稱為棧頂 top 另一端為棧底 buttom 不含元素的空表稱為空棧。棧又被稱為後進先出 last in first out 的線性表 棧的順序結構 順序棧 1.棧的順序儲存結構稱為順序棧。2.當棧滿時再做進棧運算必定產生控...
資料結構與演算法 棧和佇列
棧 是限制在表的一端進行插入和刪除運算的線性表。棧又稱後進先出簡稱lifo表 佇列 也是一種運算受限的線性表。它只允許在標的一端進行插入,而在另一端進行刪除。佇列亦稱先進先出fifo表 1.棧與佇列的區別 1 佇列先進先出,棧先進後出。2 對插入和刪除操作的 限定 棧是限定只能在表的一端進行插入和刪...