講完了棧的順序儲存結構,也給大家結合了一些例題演練,相信大家對棧再也不陌生了吧?
現在我們來看下棧的鏈式儲存結構,簡稱棧鏈。(通常我們用的都是棧的順序儲存結構儲存,鏈式儲存我們作為乙個知識點,大家知道就好!)
棧因為只是棧頂來做插入和刪除操作,所以比較好的方法就是將棧頂放在單鏈表的頭部,棧頂指標和單鏈表的頭指標合二為一。
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為最終運算結果!
逆波蘭計算法
波蘭表示式和逆波蘭表示式(棧)
中綴表示式如1 2 2 1 其運算子一般出現在運算元之間,因此稱為中綴表示式,也就是大家程式設計中寫的表達 式。編譯系統不考慮表示式的優先級別,只是對表示式從左到右進行掃瞄,當遇到運算子時,就把其前面的兩 個運算元取出,進行操作。為達到上述目的,就要將中綴表示式進行改寫,變為字尾表示式 如上面的表示...
波蘭表示式 逆波蘭表示式
中綴表示式是最常見的運算表示式,如 3 5 2 6 1 波蘭表示式又稱為字首表示式,它是由中綴表示式經過一定的方式轉換來的 比如中綴表示式為 3 5x 2 6 1 對應的字首表示式為 3 x 5 2 6 1 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...
棧和逆波蘭表示式
1 2,1 3 2,1 3 2 1 3 這些就是中綴表示式,就是我們 平時經常見到的形式,先算加減再算乘除,有括號的先算括號裡面的,沒有括號按照優先順序順序進行計算。但是,計算機處理中綴表示式卻並不方便,因為沒有一種簡單的資料結構可以方便從乙個表示式中間抽出,一部分算完結果,再放進去,然後繼續後面的...