1)設定乙個符號棧,並把符號『#』壓入棧中,並規定#的優先順序最低
2)從左往右掃瞄表示式,如果是字母就直接傳送給字尾表示式
3)如果是運算子,就與棧頂的運算子進行比較:
4)如果讀到的是左括號,則左括號入棧
5)如果讀到的是右括號,則從運算子棧中彈出運算子,一直到把左括號也彈出來為止(因為括號裡的運算子的優先順序肯定比括號外的運算子的優先順序要高),然後接著掃瞄表示式
6)如果字串已掃瞄完成,那就把棧內元素從棧頂開始依次傳送到字尾表示式中
2.字尾轉中綴
從左到右掃瞄字串,如果讀到的是字元,則不採取任何操作,直接壓入棧中;如果讀到的是運算子,則把棧頂和次棧頂的元素彈出來進行運算(為什麼可以這樣做呢?因為在轉成字尾式時,已經形成了這種機制,就是優先順序高的部分是連在一起的,比如a+b*c
的字尾式是a b c * +
,這裡b*c在字尾式中就是連在一起的,而字尾表示式的計算優越性就是在這裡體現的),然後把運算結果壓入棧中
3.容易出錯的點:
1)最後忘了把符號棧裡面的運算子都彈出來
2)遇上右括號,需要符號棧一直彈棧時,容易忘記把和當前右括號配套的左括號彈出來
3)當前運算子優先順序小於等於符號棧棧頂運算子,然後需要符號棧一直彈棧時,彈完後容易忘記把當前運算子入棧
4.這裡提一下字首表示式的計算,字首表示式的計算和字尾表示式的計算的區別如下:
表示式掃瞄順序
計算字首
從右至左
棧頂元素op次頂元素
字尾從左至右
次頂元素op棧頂元素
字尾表示式和中綴表示式的轉換
不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行 不再考慮運算子的優先規則,如 2 1 3 即2 1 3 很好理解,就是乙個符號只對其前面兩個數作用 如a b c d e f 這是怎麼搞出來的呢?選最靠中的那個優先順序最低的符號開始 把算數式分為2個部分,若符...
中綴表示式轉換字尾表示式
中綴表示式是最自然 最易被人類理解的表達方式,但是計算機處理起來並不顯得方便,這時,字尾表示式就發揮作用了 例如 計算表示式 a b c d 的值,程式裡需要不斷的判斷運算子的優先順序,先計算括號裡的子表示式 假如我們將上述表示式轉換為字尾表示式 a b c d 你會發現現在是不需要括號了 這時我們...
中綴字尾表示式的轉換
它們都是對表示式的記法,因此也被稱為字首記法 中綴記法和字尾記法。它們之間的區別在於運算子相對與運算元的位置不同 字首表示式的運算子位於與其相關的運算元之前 中綴和字尾同理。舉例 3 4 5 6 就是中綴表示式 3 4 5 6 字首表示式 3 4 5 6 字尾表示式 中綴表示式 中綴記法 中綴表示式...