応用情報技術者 2024年 秋期 午前2 問03
問題文
式A+B×Cの逆ポーランド表記法による表現として、適切なものはどれか。
選択肢
ア:+×CBA
イ:x+ABC
ウ:ABC×+(正解)
エ:CBA+×
🔒 解説は解答すると表示されます
逆ポーランド記法【午前2解説】
正解の理由
逆ポーランド記法(後置記法)では、演算子はその演算対象(オペランド)より後ろに書きます。式 A + B × C は演算子の優先度により A + (B × C) と解釈されるため、まず B と C の乗算を行い、その結果を A に加える順序が必要です。したがってオペランド順に A B C を出力し、先に乗算の演算子 × を出力、最後に加算の演算子 + を出力する表現が正しく、選択肢のうち ウ の ABC×+ がこれに一致します。
解法ステップ
以下は典型的な「シャントリングヤード法(スタックを使う方法)」で左から処理した手順です。入力を左から順に読み、オペランドは出力、演算子はスタック操作で扱います。
- 入力 A を読む → オペランドなので出力列に追加: 出力 = A
- 入力 + を読む → スタックが空なので + をスタックに積む: スタック = [+]
- 入力 B を読む → オペランドなので出力に追加: 出力 = A B
- 入力 × を読む → スタックの先頭にある + より × の方が優先度が高いので、× をそのままスタックに積む: スタック = [+, ×]
- 入力 C を読む → オペランドなので出力に追加: 出力 = A B C
- 入力が終わったのでスタックの演算子を上から順に出力へ移す(まず ×、次に +): 出力 = A B C × +
以上より最終的な逆ポーランド表記は ABC×+ となり、選択肢 ウ が正しいです。
選択肢別の誤答解説
-
ア: +×CBA
演算子が先頭に来ており、逆ポーランド記法の原則(オペランド→演算子)に反します。さらにオペランドの順序も式の意味(A + (B × C))を反映していません。 -
イ: x+ABC
先頭に演算子(ここでは小文字の x = × と仮定)や + があり、演算子がオペランドの前に来ているため後置表記になっていません。演算の順序も間違っています。 -
ウ: ABC×+
オペランドを先に出力し、乗算(BとC)を先に処理するための × をその直後に配置し、最後に加算 + を置く正しい後置表記です。従って式 A + B × C の逆ポーランド表記として適合します。 -
エ: CBA+×
これを評価すると、まず B と A の和を求め(A と B を加算)、その結果に C を掛ける形になり、C × (A + B) を表します。元の式 A + (B × C) とは演算順序が異なります。
(評価の挙動イメージ:後置式をスタックで評価すると、C B A + × は A と B を先に加算し、その結果を C と乗算するため、元の式と等しくなりません。)
よくある誤解
- 「BC× を先に書いて次に A を置く」と説明すると BC×A+ のように見えてしまい混乱します。正しくはオペランドを読み出力し、演算子は適切なタイミングでスタックから取り出して出力する手順(上記の手順)が必要です。
- 演算子の優先度を無視して左から単純に演算子を並べてしまうと誤答になります。乗算は加算より優先度が高い点を常に確認してください。
- 同じ記号(× や x)の表記ゆれに注意してください。選択肢の記号が異なっても位置関係が重要です。
補足コラム
逆ポーランド記法の利点は括弧が不要であり、スタックだけで簡潔に評価できる点です。例えば数値を代入して評価してみます:A=1, B=2, C=3 のとき ABC×+ は 1 2 3 × + → 1 (2×3) + = 7 となります。実装ではオペランドをスタックに積み、演算子が来たら必要な数だけポップして計算結果をプッシュします。
簡易な後置式評価(Python)例:
# 後置式評価の簡単な例(単一文字オペランドを辞書で置換)
values = {'A':1, 'B':2, 'C':3}
expr = "ABC×+"
def eval_postfix(expr):
stack = []
for ch in expr:
if ch in values:
stack.append(values[ch])
elif ch == '×':
b = stack.pop(); a = stack.pop(); stack.append(a*b)
elif ch == '+':
b = stack.pop(); a = stack.pop(); stack.append(a+b)
return stack[0]
print(eval_postfix(expr)) # 出力: 7
FAQ
Q. 括弧がある場合はどう変える?
A. 括弧は優先度を明示するため、シャントリングヤード法では左括弧をスタックに積み、右括弧が来たら左括弧が出るまで演算子を出力します。これにより括弧の優先が反映されます。
A. 括弧は優先度を明示するため、シャントリングヤード法では左括弧をスタックに積み、右括弧が来たら左括弧が出るまで演算子を出力します。これにより括弧の優先が反映されます。
Q. 同じ優先度の演算子が並ぶときは?
A. 通常、加減乗除には結合規則(左結合や右結合)があります。多くの二項演算子は左結合なので、スタック上の同等優先度の演算子は先に出力します。
A. 通常、加減乗除には結合規則(左結合や右結合)があります。多くの二項演算子は左結合なので、スタック上の同等優先度の演算子は先に出力します。
Q. オペランドが多桁の数や変数名の場合は?
A. トークン単位で分割して同じアルゴリズムを適用します。空白やカンマなどでトークン区切りをして処理すると良いです。
A. トークン単位で分割して同じアルゴリズムを適用します。空白やカンマなどでトークン区切りをして処理すると良いです。
関連キーワード: 逆ポーランド記法、後置記法、シャントリングヤード法、スタック評価、演算子優先度、後置式変換

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

