基本情報技術者 2014年 秋期 午前(科目A) 問04
問題文
次に示す計算式と逆ポーランド表記法の組合せのうち、適切なものはどれか。計算式と逆ポーランド表記法

選択肢
ア:
イ:
ウ:
エ:(正解)
計算式と逆ポーランド表記法の組合せ【午前2 解説】
要点まとめ
- 結論:選択肢エが正解。計算式 の逆ポーランド表記は 、つまり abcd−*+ です。
- 根拠:逆ポーランド表記は演算子をオペランドの後に置き、括弧と演算子優先度に従って出力順を決めるため、内側の が先に出力されます。
- 差がつくポイント:文字列を単に左から右へ変換するのではなく、括弧の入替と演算子の適用順(優先度・結合性)を厳密に扱うことです。
正解の理由
選択肢は「中置表記(通常の式)」と「逆ポーランド表記(後置記法)」の組合せを問う問題です。
式 の処理順はまず を計算し、その結果と を掛け、最後に に足す、という順になります。逆ポーランド表記では各演算のオペランドが先に並び、演算子が後に来るため、、すなわち abcd−*+ が正しい表記となります。したがって正解は エ です。
式 の処理順はまず を計算し、その結果と を掛け、最後に に足す、という順になります。逆ポーランド表記では各演算のオペランドが先に並び、演算子が後に来るため、、すなわち abcd−*+ が正しい表記となります。したがって正解は エ です。
よくある誤解
- 「文字列の順でそのまま演算子を移す」:括弧の内側で先に行われる演算があることを忘れて誤った順序になる。
- 「演算子の優先度を逆ポーランドで無視する」:*や/の優先度を考えず + や - と同列扱いにしてしまう。
- 「空白や区切りを無視してトークン化を誤る」:トークン分割を曖昧にすると順序が狂い発想ミスにつながる。
解法ステップ
- 式をトークンに分割する(変数、演算子、括弧)。
- 最も内側の括弧から順に、演算子の優先度に従ってオペランドの後に演算子を出力する(シャント・イングヤードやスタック方式)。
- 括弧が無くなったら、残った演算子を優先度順かつ結合性に従って出力する。
- 出力した順が逆ポーランド表記。実際に を処理すると、まず 、次に 、最後に で になる。
選択肢別の誤答解説
- ア
- 計算式:
- 与えられた逆ポーランド表記:abc*+d−
- 解説:正しい逆ポーランド表記は (ab+cd-)であり、与えられた abc+d− は に相当するため不正解。
- イ
- 計算式:
- 与えられた逆ポーランド表記:ab+c*d−
- 解説:正しい逆ポーランド表記は (abc*+d-)で、提示の ab+c*d− はトークン順が狂っており不適合。
- ウ
- 計算式:
- 与えられた逆ポーランド表記:abc* d−+(空白は無視すると "abc*d-+")
- 解説:実際は (ab+cd-*)が正解。提示の表記は演算子の位置が誤っている。
- エ
- 計算式:
- 与えられた逆ポーランド表記:abcd−*+
- 解説: → → の順で、正しく となるため正解。
補足コラム
検算として具体的な数値を代入して比べるのが簡単で確実です。例えば とすると、
- 中置表記 の値は 。
- 逆ポーランド表記 abcd−*+ をスタックで評価しても同じ結果になります。
簡易的な検算用 Python スニペット:
a,b,c,d = 1,2,5,3
infix = a + (b * (c - d))
# RPN evaluation for "a b c d - * +"
stack = []
for token in ['a','b','c','d','-','*','+']:
if token == 'a': stack.append(a)
elif token == 'b': stack.append(b)
elif token == 'c': stack.append(c)
elif token == 'd': stack.append(d)
elif token == '-':
x,y = stack.pop(), stack.pop()
stack.append(y - x)
elif token == '*':
x,y = stack.pop(), stack.pop()
stack.append(y * x)
elif token == '+':
x,y = stack.pop(), stack.pop()
stack.append(y + x)
rpn_value = stack.pop()
print(infix, rpn_value) # 5 5
FAQ
Q1: 逆ポーランド表記はどうやって素早く作る?
A1: シャント・イングヤードアルゴリズムやスタックを意識し、括弧の入れ子と演算子優先度を守って処理する練習を繰り返すと速くなります。
Q2: 乗算・除算と加算・減算の扱いは?
A2: 乗算・除算が加算・減算より優先度が高く、同じ優先度の演算子同士は通常左結合として左側から適用します。
Q3: 単項演算子(負号など)はどう扱う?
A3: 単項演算子は別トークンとして扱い、優先度や結合性を明確に定義して扱います。試験では指定がない限り具体的なルールに従って処理します。
A1: シャント・イングヤードアルゴリズムやスタックを意識し、括弧の入れ子と演算子優先度を守って処理する練習を繰り返すと速くなります。
Q2: 乗算・除算と加算・減算の扱いは?
A2: 乗算・除算が加算・減算より優先度が高く、同じ優先度の演算子同士は通常左結合として左側から適用します。
Q3: 単項演算子(負号など)はどう扱う?
A3: 単項演算子は別トークンとして扱い、優先度や結合性を明確に定義して扱います。試験では指定がない限り具体的なルールに従って処理します。
関連キーワード: 逆ポーランド記法、後置記法、中置から後置への変換、シャントイングヤード、スタック操作、演算子優先度、トークン化, 計算式検算

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

