(1-2)*(4+5)就是中綴表示式,加減符號在數字之間的表示式就是中綴表示式。人很習慣這樣的表示式,但是計算機不喜歡了,因為我們有小括號中括號大括號,還允許乙個巢狀乙個,這樣子計算機就要進行很多次if判斷才行決定**先計算。
後來,在20世紀三十年代,波蘭邏輯學家jan.lukasiewicz不知道是像牛頓一樣被蘋果砸到腦袋而想到萬有引力原理,或者還是像阿基公尺德泡在浴缸裡突發奇想給皇冠是否純金做驗證,總之他也是靈感閃現了,然後發明了一種不需要括號的字尾表示式,我們通常把它稱為逆波蘭表示式(rpn) 。
對於(1-2) * (4+5),如果用逆波蘭表示法,應該是這樣:1 2 – 4 5 + * 這種方式敢情我們人類是不大好接受的了,不過對於計算機來說,那可是喜愛至極。因為只需要利用棧的特點,就可以將這種字尾表示式的效能發揮到極致,如下圖所示
//一、 將中綴表示式轉換成字尾表示式演算法:
//1、從左至右掃瞄一中綴表示式。
//2、若讀取的是運算元,則判斷該運算元的型別,並將該運算元存入運算元堆疊
//3、若讀取的是運算子
// (1) 該運算子為左括號」(「,則直接存入運算子堆疊。
// (2) 該運算子為右括號」)」,則輸出運算子堆疊中的運算子到運算元堆疊,直到遇到左括號為止。
// (3) 該運算子為非括號運算子:
// (a) 若運算子堆疊棧頂的運算子為括號,則直接存入運算子堆疊。
// (b) 若比運算子堆疊棧頂的運算子優先順序高,則直接存入運算子堆疊。
// (c) 若比運算子堆疊棧頂的運算子優先順序低或相等,則輸出棧頂運算子到運算元堆疊,並將當前運算子壓入運算子堆疊
//4、當表示式讀取完成後運算子堆疊中尚有運算子時,則依序取出運算子到運算元堆疊,直到運算子堆疊為空。
那麼如何將「(1-2)(4+5)」轉化為「1 2 – 4 5 + 」呢?其實很簡單,利用棧的「記憶」吧,符號都推入棧即可。現在我們假設表示式為:1+(2-3)*4+10/5。則整個過程如下圖所示
所以最後輸出的結果應該是:1 2 3 - 4 * + 10 5 / +
總結規則:從左到右遍歷中綴表示式的每個數字和符號,若是數字則直接輸出,若是符號,則判斷其與棧頂符號的優先順序,是右括號或者優先順序低於棧頂符號,則棧頂元素依次出棧並輸出,直到遇到左括號或棧空才將吃屎的那個符號入棧。
棧和佇列 2
佇列 佇列比棧稍微複雜一點,特別是順序儲存結構中,有乙個rear,乙個front,要把他倆連起來,挺麻煩的,還有假溢位問題,隊空隊滿的討論都是比較難的地方,需要仔細推敲。一 基本知識 佇列 只允許在一端進行插入操作,而另一端進行刪除操作的線性表。允許插入 也稱入隊 進隊 的一端稱為隊尾,允許刪除 也...
棧和佇列 2鏈棧
adrian 鏈棧元素入棧 例如,將元素 1 2 3 4 依次入棧,等價於將各元素採用頭插法依次新增到鍊錶中,每個資料元素的新增過程如圖 2 所示 鏈棧元素出棧 例如,圖 2e 所示的鏈棧中,若要將元素 3 出棧,根據 先進後出 的原則,要先將元素 4 出棧,也就是從鍊錶中摘除,然後元素 3 才能出...
棧和佇列筆記2
佇列也稱為堆疊,是一種先進後出,刪除和插入都在棧頂操作的線性表 棧的特性 先進後出,後進先出 最先放入棧的內容最後被拿出來,最後放入棧的內容最先被拿出來 解密回文 include include intmain 判斷字串的長度是奇數還是偶數,並找到需要進行字元匹配的起始下標 if len 2 0 e...