【スタック・キューメニュー】> STEP: 3 逆ポーランド記法 (paizaランク B 相当) [難易度: 1877 ±38]
※リンク先へ移動するためには[paiza]へのログインが必要です。
逆ポーランド記法 で書かれた数式が与えられます。この数式を計算した結果を出力してください。この問題は少し難しいですが、スタックを用いて解いてみましょう。
逆ポーランド記法とは
私たちがよく用いる数式の記法は中置記法と呼ばれています。たとえば以下の数式のように、数値と数値の 間 に演算子が置かれます。
1 + 2
逆ポーランド記法では以下の数式のように、数値と数値の 後 に演算子が置かれます。
1 2 +
逆ポーランド記法の長所として、計算順序を決定する括弧を必要としません。たとえば中置記法で書かれた以下の数式について考えます。
(1 + 2) - (3 + 4)
これを逆ポーランド記法に変換すると以下のようになります。
1 2 + 3 4 + -
入力値(例)
3
1 2 +
出力値(例)
3
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php $n = trim(fgets(STDIN)); $a = explode(" ", trim(fgets(STDIN))); $numbers = []; for ($i = 0; $i < $n; $i++) { $tmp = $a[$i]; if ($tmp == '+' or $tmp == '-') { $q2 = array_pop($numbers); $q1 = array_pop($numbers); if ($tmp == '+') { $q = $q1 + $q2; } elseif ($tmp == '-') { $q = $q1 - $q2; } $numbers[] = $q; } else { $q = $tmp; $numbers[] = $q; } } echo $numbers[0]; ?> |