表示式一般由運算元(operand)、運算子(operator)組成,例如算術表示式中,通常把運算子放在兩個運算元的中間,這稱為中綴表示式(infix expression),如a+b。
波蘭數學家jan lukasiewicz提出了另一種數學表示法,它有兩種表示形式:
把運算子寫在運算元之前,稱為波蘭表示式(polish expression)或字首表示式(prefix expression),如+ab;
把運算子寫在運算元之後,稱為逆波蘭表示式(reverse polish expression)或字尾表示式(suffix expression),如ab+;
其中,逆波蘭表示式在編譯技術中有著普遍的應用。
演算法:一、 將中綴表示式轉換成字尾表示式演算法:
1、從左至右掃瞄一中綴表示式。
2、若讀取的是運算元,則判斷該運算元的型別,並將該運算元存入運算元堆疊
3、若讀取的是運算子
(1) 該運算子為左括號"(",則直接存入運算子堆疊。
(2)
該運算子為右括號")",則輸出運算子堆疊中的運算子到運算元堆疊,直到遇到左括號為止。
(3) 該運算子為非括號運算子:
(a)
若運算子堆疊棧頂的運算子為括號,則直接存入運算子堆疊。
(b)若比運算子堆疊棧頂的運算子優先順序高或相等,則直接存入運算子堆疊。
(c)
若比運算子堆疊棧頂的運算子優先順序低,則輸出棧頂運算子到運算元堆疊,並將當前運算子壓入運算子堆疊。
4、當表示式讀取完成後運算子堆疊中尚有運算子時,則依序取出運算子到運算元堆疊,直到運算子堆疊為空。
二、逆波蘭表示式求值演算法:
1、迴圈掃瞄語法單元的專案。
2、如果掃瞄的專案是運算元,則將其壓入運算元堆疊,並掃瞄下乙個專案。
3、如果掃瞄的專案是乙個二元運算子,則對棧的頂上兩個運算元執行該運算。
4、如果掃瞄的專案是乙個一元運算子,則對棧的最頂上運算元執行該運算。
5、將運算結果重新壓入堆疊。
6、重複步驟2-5,堆疊中即為結果值。
所謂的標準的表示式如"a+b",它在數學上學名叫中綴表示式(infix notation),原因是:
運算符號在兩個運算物件的中間。
其優勢:在於只:用兩種簡單操作,入棧和出棧就可以搞定任何普通表示式(僅包含:+-*/和()的表示式)的運算。
其基本運算方式:如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後,棧裡的就是結果。
為什麼說逆波蘭式產生機器碼的效率高:因為逆波蘭式非常易於計算機的處理。原因是這樣的。
逆波蘭表示式雖然看起來比較繁瑣,其實在計算機中很有用。計算機可不知道先乘除後加減,先括號內後括號外,它要把你輸入的式子變成逆波蘭表示式,它就可以不斷地執行上面兩個固定的規則,直至把結果算出來告訴你。
正常的表示式 逆波蘭表示式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
附件是做platinum 產品時做的運算工具類。分為三塊
1.解析
2.計算
3.優先順序,運算子類」+-*/()sin cos tan等「
波蘭表示式 逆波蘭表示式
中綴表示式是最常見的運算表示式,如 3 5 2 6 1 波蘭表示式又稱為字首表示式,它是由中綴表示式經過一定的方式轉換來的 比如中綴表示式為 3 5x 2 6 1 對應的字首表示式為 3 x 5 2 6 1 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...
波蘭逆波蘭表示式
實現乙個基本的計算器來計算簡單的表示式字串。表示式字串只包含非負整數,算符 左括號 和右括號 整數除法需要 向下截斷 你可以假定給定的表示式總是有效的。所有的中間結果的範圍為 231,231 1 class solution s2.push s.substr l,r l l r 碰見符號 else ...
波蘭表示式與逆波蘭表示式
2018年09月03日 11 29 15 jitwxs 閱讀數 70 標籤 波蘭 字首 更多 個人分類 演算法與資料結構 常見的算術表示式,稱為中綴表示式,例如 5 6 4 2 3波蘭表示式也稱為字首表示式,以上面的例子為例,其波蘭表示式為 5 6 4 2 3中綴表示式轉換字首表示式的操作過程為 1...