やまどり

使用可能: 数値・整数・小数、演算子 + - * / % ^、括弧 ( )。負数は (0-3) と書いてください。

逆ポーランド記法 (RPN) とは

逆ポーランド記法(Reverse Polish Notation / RPN)は、演算子をオペランドの後に置く後置記法です。 例えば、中置式 3 + 4 * 2 は RPN で 3 4 2 * + と表現されます。括弧が不要で、スタック1つで評価できるため、コンパイラやインタープリタの内部表現として広く使われます。

Shunting-yard アルゴリズム(中置→RPN変換)

エドガー・ダイクストラが1961年に考案したアルゴリズムです。演算子スタックと出力キューを用いて、演算子の優先度・結合性・括弧を正しく処理しながら中置式をRPNに変換します。計算量はO(n)です。

  • 数値はそのまま出力キューへ
  • 演算子は、スタック上の優先度が高い(左結合の場合は同等も含む)演算子をすべてポップしてから、スタックへプッシュ
  • ( はスタックへプッシュ。) は対応する ( が見つかるまでポップ
  • 最後にスタック上の残り演算子をすべてポップ

RPN の評価(スタックマシン)

RPNの評価はスタック1つで行えます。数値ならプッシュ、演算子なら2つポップして計算し結果をプッシュするだけです。最終的にスタックに残った1つの値が答えです。

演算子の優先度と結合性

  • + -: 優先度 1(左結合)
  • * / %: 優先度 2(左結合)
  • ^: 優先度 3(右結合)— 2^3^2 = 2^(3^2) = 512

活用例

  • コンパイラ・インタープリタの式評価
  • HP の電卓(RPN 入力方式)
  • PostScript 言語
  • Java Virtual Machine のオペランドスタック
  • 式木(AST)の後順走査