逆波蘭表示法（，縮寫 RPN，或逆波蘭記法、逆盧卡西維茨記法），是一種由波蘭數學家揚盧卡西維茨於 1920 年引入的數學表示式形式，在逆波蘭記法中，所有運算子置於運算元的後面，因此也被稱為字尾表示法、後序表示法。逆波蘭記法不需要括號來標識運算子的優先順序。 逆波蘭結構由和艾茲格迪科斯徹在 1960 年代早期提議用於表示式求值，以利用堆疊結構減少計算機記憶體訪問。逆波蘭記法和相應的演算法由澳大利亞哲學家、計算機學家在 1960 年代中期擴充 Charles L Hamblin and his work by Peter McBurneyCharles L Hamblin Computer Pioneer by Peter McBurney July 27 2008 Hamblin soon became aware of the problems of a computing mathematical formulae containing brackets and b the memory overhead in having dealing with memory stores each of which had its own name One solution to the first problem was Jan Lukasiewiczs Polish notation which enables a writer of mathematical notation to instruct a reader the order in which to execute the operations eg addition multiplication etc without using brackets Polish notation achieves this by having an operator etc precede the operands to which it applies eg ab instead of the usual ab Hamblin with his training in formal logic knew of Lukasiewiczs work 。 在 1960 和 1970 年代，逆波蘭記法廣泛地被用於臺式計算器，因此也在普通公眾（如工程、商業和金融等領域）中使用。 下面大部分是關於二元運算，一個一元運算使用逆波蘭記法的例子是階乘的記法。 解釋 逆波蘭記法中，運算子置於運算元的後面。例如表達 三加四 時，寫作 ，而不是 3 4。如果有多個運算子，運算子置於第二個運算元的後面，所以常規中綴記法的 3 4 5 在逆波蘭記法中寫作 ：先 3 減去 4，再加上 5。使用逆波蘭記法的一個好處是不需要使用括號。例如中綴記法中 3 4 5 與 （3 4）5 不相同，但字尾記法中前者寫做 ，無歧義地表示 3 4 5 ；後者寫做 。 逆波蘭表示式的直譯器一般是基於堆疊的。解釋過程一般是：運算元入棧；遇到運算子時，操作數出棧，求值，將結果入棧；當一遍後，棧頂就是表示式的值。因此逆波蘭表示式的求值使用堆疊結構很容易實現，並且能很快求值。 注意：逆波蘭記法並不是簡單的波蘭表示式的反轉。因為對於不滿足交換律的運算子，它的運算元寫法仍然是常規順序，如，波蘭記法 6 3 的逆波蘭記法是 6 3 而不是 3 6 ；數字的數位寫法也是常規順序。 與中綴記法的轉換 艾茲格迪科斯徹引入了排程場演算法，用於將中綴表示式轉換為字尾形式。因其操作類似於火車編組場而得名。 大多數運算子優先順序解析器 解析器用簡單的查表操作即可實現，優先順序表由開發者自己定製，在不同的應用場景中，開發者可自由改變運算子的優先順序 能轉換為處理字尾表示式，實際中，一般構造抽象語法樹，樹的後序遍歷即為逆波蘭記法。 逆波蘭表示式求值 虛擬碼 while 有輸入 讀入下一個符號 X IF X 是一個運算元 入棧 ELSE IF X 是一個運算子 有一個先驗的表格給出該運算子需要 n 個引數 IF 堆疊中少於 n 個運算元 （錯誤） 使用者沒有輸入足夠的運算元 Else，n 個操作數出棧 計算運算子。 將計算所得的值入棧 IF 棧內只有一個值 這個值就是整個計算式的結果 ELSE 多於一個值 （錯誤） 使用者輸入了多餘的運算元 例子 中綴表示式 5 1 2 4 3 寫作 下表給出了該逆波蘭表示式從左至右求值的過程，堆疊欄給出了中間值，用於跟蹤演算法。 輸入 操作 堆疊 註釋 5 入棧 5 1 入棧 5 1 2 入棧 5 1 2 加法運算 5 3 1 2 出棧，將結果 3 入棧 4 入棧 5 3 4 乘法運算 5 12 3 4 出棧，將結果 12 入棧 加法運算 17 5 12 出棧，將結果 17 入棧 3 入棧 17 3 減法運算 14 17 3 出棧，將結果 14 入棧 計算完成時，棧內只有一個運算元，這就是表示式的結果：14 C 程式實現 include iostream includequeue includestack define ERROR 0 define OK 1 using namespace std typedef int Staus typedef double ElemType bool Get_ops stackElemType st ElemType op1 ElemType op2 if stsize 2 return ERROR op1 sttop stpop op2 sttop stpop return OK Staus Solve stackElemType st char oper bool flag 0 ElemType oper1 oper2 flag Get_ops st oper1 oper2 if flag switch oper case stpush oper2 oper1 break case stpush oper2 oper1 break case stpush oper2 oper1 break case if oper1 cout Divide by 0！ endl return ERROR else stpush oper2 oper1 break case stpush pow oper2 oper1 break else return ERROR return OK int main stackElemType suffix char c ElemType t c getchar while c switch c case break case case case case case Solve suffix c break defaultungetc c stdin cin t suffixpush t c getchar cout suffixtop endl return 0 上述運算可以重寫為如下運算鏈方法（用於 HP 的逆波蘭計算器）：As was demonstrated in the Algebraic mode it is usually easier fewer keystrokes in working a problem like this to begin with the arithmetic operations inside the parentheses first 1 2 4 5 3 實現 第一代實現了逆波蘭架構的電子計算機是英國電氣公司 1963 年交付使用的 KDF9 和美國的 Burroughs B5000。Friden 公司在它 1963 年推出的 EC130 中，將逆波蘭表示式引入了臺式計算器市場。惠普 1968 年設計了 9100A 逆波蘭計算器，首臺手持式計算器 HP35 也使用逆波蘭表示式，惠普在 HP10A 之前的所有手持計算器（包括科學計算，金融和可程式設計）中使用了逆波蘭表示式，並在 1980 年代晚期的 LCD 顯示計算器如 HP10C HP11C HP15C HP16C，等都是用了逆波蘭表示式。 實際意義 當有運算子時就計算，因此，表示式並不是從右至左整體計算而是每次由中心向外計算一部分，這樣在複雜運算中就很少導致運算子錯誤。 堆疊自動記錄中間結果，這就是為什麼逆波蘭計算器能容易對任意複雜的表示式求值。與普通科學計算器不同，它對錶達式的複雜性沒有限制。 逆波蘭表示式中不需要括號，使用者只需按照表達式順序求值，讓堆疊自動記錄中間結果；同樣的，也不需要指定運算子的優先順序。 逆波蘭計算器中，沒有 等號 鍵用於開始計算。 逆波蘭計算器需要 確認 鍵用於區分兩個相鄰的運算元。 機器狀態永遠是一個堆疊狀態，堆疊裡是需要運算的運算元，棧內不會有運算子。 教育意義上，逆波蘭計算器的使用者必須懂得要計算的表示式的含義。 目前逆波蘭的實現有： 任何基於棧的程式語言： Forth Factor PostScript 語言。 線上的逆波蘭計算器 Windows 下逆波蘭計算器 Windows XP 下的 Microsoft PowerToy calculator 手機逆波蘭計算器 開源的 JAVA 計算器 Palm PDA 下的逆波蘭計算器 Mac OS X 計算器 Mac OS X 和 iPhone 下的逆波蘭計算器 Unix 下的計算程式 dc 互動式 JavaScript 的逆波蘭計算器： 和 WikibooksAda ProgrammingMathematical calculations Ada 語言中的逆波蘭計算器 Emacs 的 lisp lib 包 calc 基於 GTK 的 galculator 表示式轉換 scratch 註釋 參見 Forth PostScript LIFO 棧機器（Stack machine） 波蘭表示法 面向堆疊程式設計 參考 RPN or DAL A brief analysis of Reverse Polish Notation against Direct Algebraic Logic By James Redin Postfix Notation MiniLecture By Bob Brown Fith An Alien Conlang With A LIFO Grammar By Jeffrey Henning Good Ideas Through the Looking Glass By Nick Wurth Category 數學表示法 Category 波蘭科技 Category 運算子_程式設計