基本情報技術者 2010年 春期 午前(科目A) 問03
問題文
のとき、逆ポーランド表記法で表現された式 の演算結果はどれか。
選択肢
ア:-12
イ:2
ウ:12(正解)
エ:14
🔒 解説は解答すると表示されます
逆ポーランド記法の演算評価【午前解説】
正解の理由
逆ポーランド表記は演算子が来たら直前の2つの値を取り出して計算する方式です。本問のトークン列は A B + C D E / - * の順であり、具体的に
1 と 3 を足して 4、次に 4 と 2 を割って 2、最後に中間結果の 4 と 3 を掛けることで となります。したがって正解は ウ(12)です。
解法ステップ
- トークン列を左から順に読む:A B + C D E / - *
- 値を見つけたらスタックに積む(push)、演算子が来たら直近2つを取り出して演算し結果を戻す(pop, op, push)。
- 実際のスタック変化(以下で詳述)を追えば答えが得られる。
スタック追跡(値で示す):
- 初期 []
- A=1 を push → [1]
- B=3 を push → [1, 3]
- '+' で 1 + 3 = 4 を push → [4]
- C=5 を push → [4, 5]
- D=4 を push → [4, 5, 4]
- E=2 を push → [4, 5, 4, 2]
- '/' で 4 / 2 = 2 を push → [4, 5, 2] (左オペランドが 4、右が 2)
- '-' で 5 - 2 = 3 を push → [4, 3]
- '*' で 4 * 3 = 12 を push → [12] → 最終結果 12
選択肢別の誤答解説
- ア: -12
- 逆ポーランド表記でオペランド順を逆に扱い、 と のような符号ミスや順序ミスで生じうる値です。符号や順序を厳密に確認すれば防げます。
- イ: 2
- 中間段階の値 を最終結果と誤認したケース。最終演算(ここでは掛け算)を忘れがちです。
- ウ: 12(正解)
- 正しくスタック手順に従って演算した結果で、最終スタック値が になります。
- エ: 14
- おそらく と を足して に何らかの誤加算や別の順序ミスで にズレるような計算ミスが原因です。
よくある誤解
- 演算子の適用順を読み違えて「/ や - のオペランド順が逆」になり、 を のように誤計算する。
- RPN を中置(通常の式)と混同して左から単純に計算しようとし、スタック操作を省略して途中の値を見落とすこと。
- 最後の掛け算を忘れて中間結果(例:2 や 3)を答えにしてしまうミス。
補足コラム
逆ポーランド表記(RPN)はスタックベースの評価で人間が電卓を操作する時やコンパイラの式評価に便利です。実装はシンプルで、全ての演算を定義済み関数に置き換えてスタック操作を行えば良いだけです。整数の割り算は言語や定義により切り捨てや商の扱いが変わるため注意してください。本問では の整数割り算で問題ありません。
コード例(RPN 評価の簡易実装例):
def eval_rpn(tokens, values):
stack = []
for t in tokens:
if t in values:
stack.append(values[t])
else:
b = stack.pop()
a = stack.pop()
if t == '+':
stack.append(a + b)
elif t == '-':
stack.append(a - b)
elif t == '*':
stack.append(a * b)
elif t == '/':
stack.append(a // b) # 整数除算の例
return stack[0]
tokens = ['A','B','+','C','D','E','/','-','*']
vals = {'A':1,'B':3,'C':5,'D':4,'E':2}
print(eval_rpn(tokens, vals)) # 12
FAQ
Q. 逆ポーランド表記で「/」や「-」のオペランドはどちらが左ですか?
A. スタックから直近に取り出す値が右オペランド、その前に積まれていた方が左オペランドです(つまり pop 2 回目が左)。
A. スタックから直近に取り出す値が右オペランド、その前に積まれていた方が左オペランドです(つまり pop 2 回目が左)。
Q. 小数や負の値が出たらどう扱えば良いですか?
A. 問題文の定義に従います。整数除算なら切り捨てや切り上げの定義、浮動小数点ならそのまま計算します。試験問題は通常整数で整除されるよう出題されます。
A. 問題文の定義に従います。整数除算なら切り捨てや切り上げの定義、浮動小数点ならそのまま計算します。試験問題は通常整数で整除されるよう出題されます。
Q. RPN に慣れる練習法は?
A. 短い式からスタックを手で追って練習し、次に様々な演算子(+/−/*//)を混ぜた式を多数解くと良いです。プログラムで自動評価させるのも有効です。
A. 短い式からスタックを手で追って練習し、次に様々な演算子(+/−/*//)を混ぜた式を多数解くと良いです。プログラムで自動評価させるのも有効です。
関連キーワード: 逆ポーランド表記, RPN, スタック評価, 演算順序, 後置記法、トークン解析, 中置から後置変換

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

