基本情報技術者 2012年 春期 午前(科目A) 問04
問題文
後置記法(逆ポーランド記法)では、例えば、式をと表現する。次の式を後置記法で表現したものはどれか。
選択肢
ア:
イ:(正解)
ウ:
エ:
🔒 解説は解答すると表示されます
後置記法(逆ポーランド記法)【午前解説】
正解の理由
右辺の式 を中置から後置へ変換すると、まず各括弧内を個別に後置にし、次に乗算を最後に置きます。
(A+B)→ A B + 、 (C - D ÷ E) は D ÷ E が先に計算されるため C D E ÷ -。これらを掛け合わせると A B + C D E ÷ - ×。問題の表記ルールに従い左辺の Y を前に、代入記号 = を最後に付けると YAB+CDE÷-×= となり、選択肢のイが一致します。
(A+B)→ A B + 、 (C - D ÷ E) は D ÷ E が先に計算されるため C D E ÷ -。これらを掛け合わせると A B + C D E ÷ - ×。問題の表記ルールに従い左辺の Y を前に、代入記号 = を最後に付けると YAB+CDE÷-×= となり、選択肢のイが一致します。
解法ステップ
- 右辺のみを中置表現で分解: (A+B) と (C - D ÷ E) 。
- 各括弧内を後置に変換: (A+B) -> A B + 、 D ÷ E -> D E ÷ 、したがって (C - D ÷ E) -> C D E ÷ - 。
- 括弧同士を掛けるので乗算を最後に置く:A B + C D E ÷ - × 。
- 問題の表記規則に合わせて左辺の変数 Y を先頭に、代入記号 = を末尾に付ける:Y A B + C D E ÷ - × =。
- 記号を選択肢の形式に一致させると YAB+CDE÷-×=、つまりイ。
選択肢別の誤答解説
- ア: YAB+C-DE÷×=
- 何が誤っているか:C と D の間に先に減算を置いており、D÷E の優先を無視しています。D と E の除算が先であるべきです。
- イ: YAB+CDE÷-×=
- 正解:括弧と演算子優先度を正しく適用した後置表現です。
- ウ: YAB+EDC÷-×=
- 何が誤っているか:D と E の順序が入れ替わっており、除算のオペランド順が逆転しています(非可換のため誤り)。
- エ: YBA+CD-E÷×=
- 何が誤っているか:A と B の順序が逆になっており、まず加算のオペランド順を誤っています。また括弧内の構造も崩れています。
よくある誤解
- 減算・除算のオペランド順を入れ替えてもよいと誤解する:非可換演算なので順序を逆にすると意味が変わります。
- 括弧内の演算順を誤る:D÷E を先に計算する点を見落とすと C と D の順序が狂います。
- 代入の位置表現を混同する:問題では Y を先頭、最後に= を付ける表記を使っている点を忘れがちです。
補足コラム
後置記法(逆ポーランド記法)はスタックを用いた評価・変換が基本です。中置→後置変換にはダイクストラのシャントゥング・ヤード(shunting-yard)アルゴリズムがよく使われ、演算子の優先度と括弧を管理して正確に変換できます。 postfix(後置)表現は計算機実装でスタック一つで効率よく評価できる利点があります。
簡単な変換・評価のイメージ(Python例)
# シンプルな中置->後置(演算子は + - * / 、括弧のみ対応)
def infix_to_postfix(tokens):
prec = {'+':1, '-':1, '*':2, '/':2}
output = []
stack = []
for t in tokens:
if t.isalpha(): # 変数
output.append(t)
elif t in prec:
while stack and stack[-1] != '(' and prec[stack[-1]] >= prec[t]:
output.append(stack.pop())
stack.append(t)
elif t == '(':
stack.append(t)
elif t == ')':
while stack and stack[-1] != '(':
output.append(stack.pop())
stack.pop()
while stack:
output.append(stack.pop())
return output
# 使い方: tokens = list(' ( A + B ) * ( C - D / E ) '.split())
FAQ
Q1: 減算や除算のオペランドを入れ替えても同じですか?
A1: いいえ。減算・除算は非可換演算なのでオペランドの順序が結果に直接影響します。後置記法でも順序を保持する必要があります。
A1: いいえ。減算・除算は非可換演算なのでオペランドの順序が結果に直接影響します。後置記法でも順序を保持する必要があります。
Q2: 括弧が多くても同じ手順で変換できますか?
A2: はい。シャントゥング・ヤードのようにスタックで括弧と演算子の優先度を管理すれば正しく変換できます。
A2: はい。シャントゥング・ヤードのようにスタックで括弧と演算子の優先度を管理すれば正しく変換できます。
Q3: 問題の表記で Y が先頭、= が末尾になっているのはなぜですか?
A3: 問題の例題と選択肢は代入の LHS を先頭に置き、式の後に代入記号を付ける表記を採っています。後置記法そのものの一般表現とは表記ルールの差異です。
A3: 問題の例題と選択肢は代入の LHS を先頭に置き、式の後に代入記号を付ける表記を採っています。後置記法そのものの一般表現とは表記ルールの差異です。
関連キーワード: 後置記法、逆ポーランド記法、スタック、演算子優先順位、中置→後置変換、シャントゥング・ヤード

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

