操車場アルゴリズム:中置→逆ポーランド
中置式を「スタック」と「出力キュー」で 1 ステップずつ逆ポーランド記法(RPN)へ変換します。優先順位と括弧で pop と push が切り替わる様子を体感しましょう。
0 / 0
数式プリセット(押すと読み込み)
入力(中置式トークン)
—
いま読むトークン
—
スタックの深さ
0
出力キューの長さ
0
演算子スタック(上が頭=top)
入力トークン列 → 出力キュー(RPN)
操車場アルゴリズム(Shunting-yard)は、ダイクストラが考案した「中置式 → 逆ポーランド記法」変換法です。
線路の操車場で貨車を一時的に側線へ退避させて並べ替えるイメージから名づけられました。
トークンを左から 1 つずつ読み、数値はそのまま出力キューへ、演算子はスタックを経由させます。 新しい演算子を積む前に、スタック頭の演算子の優先順位が同等以上(左結合)なら先に出力へ pop します。これで「掛け算は足し算より先」という規則が自動的に守られます。
括弧
プリセットを選び、スライダーやボタンで 1 ステップずつ pop / push を追ってみましょう。
トークンを左から 1 つずつ読み、数値はそのまま出力キューへ、演算子はスタックを経由させます。 新しい演算子を積む前に、スタック頭の演算子の優先順位が同等以上(左結合)なら先に出力へ pop します。これで「掛け算は足し算より先」という規則が自動的に守られます。
括弧
( は区切りとしてスタックに積み、) が来たら ( までを pop します。最後にスタックに残った演算子を全部 pop すれば RPN の完成です。プリセットを選び、スライダーやボタンで 1 ステップずつ pop / push を追ってみましょう。
いま何が起きている?
ここがポイント
- 数値は素通り ── オペランド(数)は読んだ瞬間にそのまま出力キューへ送る。
- 演算子はスタックで待つ ── 積む前に、頭にある優先順位が同等以上の演算子を先に出力へ pop(左結合のとき)。これで
2+3*4が2 3 4 * +になる。 - 括弧は区切り ──
(は積むだけ、)で対応する(まで pop。優先順位の壁を作る。 - 計算量は O(n) ── 各トークンは push と pop を高々 1 回ずつ。1 パスで RPN に変換できる。