字首 中綴 字尾表示式

2022-09-22 01:36:07 字數 1664 閱讀 5226

中綴表示式:最常見的運算表示式,一般轉成字尾表示式

字首表示式(波蘭表示式)

1.運算子位於操作符之前

2.求值步驟

(1)從右至左掃瞄表示式:遇數字,壓入數棧;遇運算子,彈出數棧的棧頂、次頂元素,運算順序:棧頂 運算子 次頂,運算結果入棧

(2)重複上述過程到表示式最左端,最後的運算值即結果

字尾表示式(逆波蘭表示式)

1.運算子位於操作符之後

2.求值步驟

(1)從左至右掃瞄表示式:遇數字,壓入數棧;遇運算子,彈出數棧的棧頂、次頂元素,運算順序:次頂 運算子 棧頂,運算結果入棧

(2)重複上述過程到表示式最右端,最後的運算值即結果

直接轉換法

例:a+b*c-(d+e)

1.中綴表示式轉字首表示式

(1)根據運算子的優先順序對中綴表示式加括號:((a+(b*c))-(d+e))

(2)將運算子移到對應的括號前面:-(+(a*(bc))+(de))

(3)去掉所有括號,即為字首表示式:-+a*bc+de

2.中綴表示式轉字尾表示式

(1)根據運算子的優先順序對中綴表示式加括號:((a+(b*c))-(d+e))

(2)將運算子移到對應的括號後面:((a(bc)*)+(de)+)-

(3)去掉所有括號,即為字尾表示式:abc*+de+-

中綴表示式轉字尾表示式實現思路

1.初始化兩個棧:運算子棧 s1 和儲存中間結果的棧 s2

2.從左至右掃瞄中綴表示式

3.遇運算元,壓入s2

4.遇運算子:

(1)如果 s1 為空,或棧頂運算子為左括號「(」,則直接將此運算子入棧

(2)若優先順序》棧頂運算子,也將運算子壓入 s1

(3)若優先順序<=棧頂運算子,將 s1 棧頂的運算子彈出並壓入到 s2 中,再與 s1 中新的棧頂運算子相比較

5.遇到括號時:

(1)若為左括號「(」,則直接壓入 s1

(2)若為右括號「)」,則依次彈出 s1 棧頂的運算子,並壓入 s2,直到遇到左括號「(」為止,此時將這一對括號丟棄

6.重複步驟 2 至 5,直到中綴表示式的最右邊

7.將 s1 中剩餘運算子依次彈出並壓入 s2

8.依次彈出 s2 中的元素並輸出,結果的逆序即為中綴表示式對應的字尾表示式

字尾表示式計算器**實現

import j**a.util.arraylist;

import j**a.util.list;

import j**a.util.stack;

public class suffixexpressioncalculator

return list;//將字尾表示式的資料和運算子放入arraylist

}public static int calculate(listlist) else else if (item.equals("-")) else if (item.equals("*")) else if (item.equals("/")) else

stack.push("" + result);//棧內是string,將int轉成string壓入棧}}

return integer.parseint(stack.pop());//棧內是string,將string轉成int彈出棧

}}

字首 中綴 字尾表示式

它們都是對表示式的記法,因此也被稱為字首記法 中綴記法和字尾記法。它們之間的區別在於運算子相對與運算元的位置不同 字首表示式的運算子位於與其相關的運算元之前 中綴和字尾同理。舉例 3 4 5 6 就是中綴表示式 3 4 5 6 字首表示式 3 4 5 6 字尾表示式 中綴表示式 中綴記法 中綴表示式...

字首 中綴 字尾表示式

最近筆試的過程中老是有中綴轉換為字首,或是中綴轉換為字尾的問題,資料結構學了這麼久真的是記不清了,今天重新複習了一下,藉此機會總結一下 中綴 我們正常理解的表示式的書寫方式 字首 操作符全部位於運算元的前面,運算元的順序為從右到左依次壓棧的順序,操作符為從左到右依次壓棧的順序 字尾 不包含括號,運算...

字首 中綴 字尾表示式

它們都是對表示式的記法,因此也被稱為字首記法 中綴記法和字尾記法。它們之間的區別在於運算子相對與運算元的位置不同 字首表示式的運算子位於與其相關的運算元之前 中綴和字尾同理。舉例 3 4 5 6 就是中綴表示式 3 4 5 6 字首表示式 3 4 5 6 字尾表示式 中綴表示式 中綴記法 中綴表示式...