応用情報技術者 2013年 春期 午後 問02
一般的な表記法の数式を逆ポーランド表記法に変換するアルゴリズムに関する次の記述を読んで、設問1〜3に答えよ。
逆ポーランド表記法とは、演算子を二つの演算対象の後ろに配置することによって、数式を表現する表記法である。例えば、一般的な表記法の数式1+2×3を、逆ポーランド表記法では1 2 3 × + と表記する。
逆ポーランド表記法で表記した数式は、数値や演算子を左から順に処理すればよく、括弧を使う必要もないので、コンピュータが数式を取り扱うのに都合が良い。
一般的な表記法の数式から逆ポーランド表記法への変換は、スタックを用いることで容易に実現できる。
〔逆ポーランド表記法への変換アルゴリズム〕
一般的な表記法の数式を逆ポーランド表記法に変換するアルゴリズムでは、まず変換前の数式を、数値、演算子及び括弧の要素(以下、演算要素という)に分解する。演算子には二項演算子 +、−、×、÷ を用い、括弧には “ ( ” と “ ) ” を用いる。数値は0〜9の1桁の数とする。それぞれの演算要素には、優先度を定義する。
変換の処理には、変換前配列、スタック及び変換後配列を用いる。初期状態では、変換前配列には変換前の数式の演算要素が順に入っており、スタックと変換後配列は空の状態である。変換後には、変換後配列に逆ポーランド表記法に変換した結果が入る。例えば、変換前の数式が1+2×3の場合、初期状態は表1のようになる。

逆ポーランド表記法への変換は、次の(1)〜(4)の手順で行う。
(1) 変換前配列の先頭から順に、演算要素を1個参照する。
参照する演算要素がない場合は(4)に進む。
(2) スタック上に演算要素がある場合は、スタックの先頭にある演算要素の優先度を参照し、(1)の演算要素の優先度以上なら、スタックの先頭の演算要素をポップし、変換後配列の末尾に追加する。これを、スタックの先頭の演算要素の優先度が、(1)の演算要素の優先度未満になるまで繰り返す。ただし、スタックの先頭の演算要素が“ ( ”の場合は、そこで繰返しを終了する。
(3) (1)で参照した演算要素が“ ) ”なら、それを破棄し、その際スタックの先頭にあるはずの“ ( ”もポップして破棄した後 (1)に戻る。(1)で参照した演算要素が“ ) ”以外なら、その演算要素をスタックにプッシュし、(1)に戻る。
(4) スタック上にある全ての演算要素を順番にポップし、変換後配列の末尾に追加する。
演算要素の優先度を表2に、数式1+2×3を変換するときの処理過程を図1に示す。なお、図1中の丸で囲った演算要素は、(1)の手順で参照した演算要素である。

〔逆ポーランド表記法への変換プログラム〕
逆ポーランド表記法への変換プログラムを作成した。プログラム中で使用する主な変数、配列及び関数を表3に、作成したプログラムを図2に示す。
図2のプログラムでは、スタックの取扱いを容易にするために、ダミーの演算要素nullを定義し、プログラム開始直後にスタックにプッシュしている。
nullがスタックからポップされることがないようにするために、その優先度をオと定義する。こうすることで、プログラム中、手順(2)の処理を行う部分でカの判定処理を記述する必要がなくなり、プログラムが簡潔になる。

〔エラーチェックの追加〕
図2のプログラムの①の箇所において、iが2以上のとき、GetElement(i−1) の優先度と、GetElement(i) の優先度を比較することによって、簡易的な入力エラーチェックを追加することができる。例えば、数値の演算要素が2個以上連続する場合や、“ ) ” の直後に “ ( ” が続く場合など、四則演算の式として不正なものがあった場合はエラーとする。
入力エラーとする条件を表4に示す。GetElement(i−1)の優先度と、GetElement(i)の優先度について、表4に従って評価をした結果、“OK”の場合は、そのまま処理を続行する。評価した結果が“Err”の場合は、入力された数式が誤っていると判断して処理を中断する。
設問1:逆ポーランド表記法への変換について、(1)、(2)に答えよ。
問題文を見る(1)数式(2+3)×4を逆ポーランド表記法に変換した結果を答えよ。
模範解答
23+4×
解説
解答の導き方
問題文には「逆ポーランド表記法とは、演算子を二つの演算対象の後ろに配置することによって、数式を表現する表記法である」とあり、演算子を被演算子の後ろに置く形式へ変換することが目的です。変換手順は手順(1)〜(4)に従って行います。さらに表2から優先度が定義されており、表2の記号割り当ては ア=×、イ=÷、ウ=+、エ=− であるため、×と÷の優先度(3)は+と−の優先度(2)より高いことがわかります。これらを根拠に、手順に沿って順番に処理します。
対象の式は です。演算要素に分解すると順に
(, 2, +, 3, ), ×, 4
となり、それぞれの優先度は表2に基づいて
(=5), 2=4, +=2, 3=4, )=1, ×=3, 4=4
です。
手順の適用を順に示します(各参照時はまず手順(2)の「スタック先頭の優先度と比較して必要ならポップして変換後配列へ追加」を評価し、その後手順(3)に従って「')'なら破棄して'('をポップ、そうでなければ参照要素をスタックにプッシュ」します)。
-
参照1:'('(優先度5)
- スタックは空なのでポップはなし。')'でないのでスタックにプッシュ。
- スタック: (
- 変換後配列:(空)
-
参照2:'2'(優先度4)
- スタック先頭は '('(優先度5)だが「スタックの先頭が '(' の場合はそこで繰り返しを終了する」とあるためポップは行わない。
- '2'は')'でないのでスタックにプッシュ。
- スタック: ( , 2(先頭)
- 変換後配列:(空)
-
参照3:'+'(優先度2)
- スタック先頭は '2'(優先度4)で、4 ≥ 2かつ先頭は '(' でないので '2' をポップして変換後配列へ追加。
- 次のスタック先頭は '(' なのでポップを止める。
- '+'は')'でないのでスタックにプッシュ。
- スタック: ( , +(先頭)
- 変換後配列: 2
-
参照4:'3'(優先度4)
- スタック先頭は '+'(優先度2)、2 ≥ 4は偽なのでポップしない。
- '3'をスタックにプッシュ。
- スタック: ( , + , 3(先頭)
- 変換後配列: 2
-
参照5:')'(優先度1)
- スタック先頭は '3'(優先度4)で4 ≥ 1かつ先頭は '(' でないので '3' をポップして変換後配列へ追加。
- 次にスタック先頭は '+'(優先度2)で2 ≥ 1なので '+' をポップして変換後配列へ追加。
- 次のスタック先頭は '(' のためポップを停止。
- 参照要素が ')' なのでこの ')' を破棄し、スタックの先頭にあるはずの '(' もポップして破棄する(手順(3))。
- スタック:(空)
- 変換後配列: 2, 3, +
-
参照6:'×'(優先度3)
- スタックは空なのでポップはなし。
- '×'をスタックにプッシュ。
- スタック: ×(先頭)
- 変換後配列: 2, 3, +
-
参照7:'4'(優先度4)
- スタック先頭は '×'(優先度3)、3 ≥ 4は偽なのでポップしない。
- '4'をスタックにプッシュ。
- スタック: × , 4(先頭)
- 変換後配列: 2, 3, +
-
手順(4):スタックに残った全ての要素を順にポップして変換後配列へ追加(先頭から順にポップするので先に '4'、次に '×' を追加)。
- 最終の変換後配列: 2, 3, +, 4, ×
したがって、逆ポーランド表記法での表記は 「23+4×」 となります(模範解答と一致します)。
誤りやすいポイント
- 「'(' は優先度5だが、スタック先頭が '(' のときはそこで繰り返しを終了する」という手順を見落とし、'(' を誤ってポップしてしまう。括弧はグループ区切りなので特別扱いする点を必ず確認すること。
- 表2の ア〜エ の割り当てを誤ると優先度比較が逆になり、乗除と加減の順序を取り違えて誤答になる。正しくは ア=×、イ=÷、ウ=+、エ=−。
- アルゴリズムでは「参照→(必要な分だけ)スタックからポップ→参照要素をスタックにプッシュ(')' の場合は別処理)」という順序が重要です。処理順を逆にすると出力順が狂います。
- 最後のスタックの取り出し順(先頭からポップして結果に追加)を逆に実装すると演算子の順序が逆になり誤りになります。
FAQ
Q: このアルゴリズムでは数値を見つけたら即座に変換後配列へ出力してよいですか?
A: 本問で示された手順では、参照した演算要素が ') ' 以外の場合は「その演算要素をスタックにプッシュする」と明記されており、数値も一旦スタックへ置かれます。ポップして変換後配列へ移すのはスタック先頭の優先度と比較した結果によります。実装により数値を即出力する方法でも正しく動くことがありますが、本手順に沿って処理することを確認してください。
A: 本問で示された手順では、参照した演算要素が ') ' 以外の場合は「その演算要素をスタックにプッシュする」と明記されており、数値も一旦スタックへ置かれます。ポップして変換後配列へ移すのはスタック先頭の優先度と比較した結果によります。実装により数値を即出力する方法でも正しく動くことがありますが、本手順に沿って処理することを確認してください。
Q: なぜ '(' の優先度は高いのにポップを止めるのですか?
A: 表2は優先度の数値を与えていますが、手順(2)には「ただし、スタックの先頭の演算要素が “ ( ” の場合は、そこで繰り返しを終了する」とあるため、'(' は括弧の開始としてスタック上の区切り(セパレータ)になり、内部の要素が外へ漏れないようにするためです。これにより括弧で明示された結合順序が保持されます。
A: 表2は優先度の数値を与えていますが、手順(2)には「ただし、スタックの先頭の演算要素が “ ( ” の場合は、そこで繰り返しを終了する」とあるため、'(' は括弧の開始としてスタック上の区切り(セパレータ)になり、内部の要素が外へ漏れないようにするためです。これにより括弧で明示された結合順序が保持されます。
Q: 問題文は数値を0〜9の1桁に限定していますが、実務で多桁数値を扱う場合はどうしますか?
A: トークン化(字句解析)で多桁の数値を1つの演算要素として扱えば、アルゴリズムの本質は変わりません。トークン単位で優先度比較とスタック処理を行ってください。
A: トークン化(字句解析)で多桁の数値を1つの演算要素として扱えば、アルゴリズムの本質は変わりません。トークン単位で優先度比較とスタック処理を行ってください。
関連キーワード: 逆ポーランド表記法、スタック、中置記法、演算子優先度、括弧処理
設問1:逆ポーランド表記法への変換について、(1)、(2)に答えよ。
問題文を見る模範解答
ア:×
イ:÷
ウ:+
エ:−
解説
解答の論理構成
-
演算子集合の確認
【問題文】には「演算子には二項演算子 +、−、×、÷ を用い」とあります。したがって空欄 ア〜エ にはこの4つを重複なく配置します。 -
優先度テーブルの読み取り
【問題文】の「表2 演算要素の優先度」より、空欄は次の2段階に分かれています。
・優先度3 … ア, イ
・優先度2 … ウ, エ
同じ表には「注記 値が大きいほど優先度が高い。」と記載されています。 -
一般的な四則演算の規則との対応づけ
一般に「×」「÷」は「+」「−」より高い優先度を持ちます。これは【問題文】冒頭の例「一般的な表記法の数式1+2×3を、逆ポーランド表記法では1 2 3 × + と表記する」からも読み取れます。
・先に「×」を評価するためにスタックに残り、後から「+」が出力されている=「×」のほうが高優先度。 -
優先度3と優先度2への割当
よって、優先度3には「×」「÷」、優先度2には「+」「−」を入れれば演算規則と矛盾しません。
「アとイは順不同、ウとエは順不同」とあるため、具体的な配置は
ア:× イ:÷ ウ:+ エ:−
で成立します。
誤りやすいポイント
- 「値が大きいほど優先度が高い」という注記を読み飛ばし、数字が小さい方が高いと思い込む。
- 「+」「−」と「×」「÷」の4つすべてに異なる優先度があると誤解し、5段階に分けようとする。
- 例「1+2×3」の動作を確認せず、直感だけで割当て順を決定してしまう。
- 「÷」の優先度を「−」と同じにしてしまい、変換テストをするとスタック制御が破綻する。
FAQ
Q: 「×」と「÷」の優先度は同じで良いのですか?
A: はい。四則演算では乗算と除算は同一レベルで評価します。したがって表では両方とも優先度3に割り当てます。
A: はい。四則演算では乗算と除算は同一レベルで評価します。したがって表では両方とも優先度3に割り当てます。
Q: 「+」と「−」の優先度も同じにする根拠は?
A: 加算と減算は互いに逆演算の関係であり、標準的な算術規則で同一レベルに分類されます。そのため表ではともに優先度2に置きます。
A: 加算と減算は互いに逆演算の関係であり、標準的な算術規則で同一レベルに分類されます。そのため表ではともに優先度2に置きます。
Q: 優先度が同じ演算子同士の結合順序(左結合/右結合)は考慮しなくて良い?
A: 今回のアルゴリズムはスタックから「優先度以上」でポップすると規定しているため、同じ優先度なら左側(先に現れた方)が先に出力されます。これは四則演算の左結合規則に一致します。
A: 今回のアルゴリズムはスタックから「優先度以上」でポップすると規定しているため、同じ優先度なら左側(先に現れた方)が先に出力されます。これは四則演算の左結合規則に一致します。
関連キーワード: インフィクス記法, オペランドスタック, オペレータ優先度, スタックアルゴリズム
設問2:〔逆ポーランド表記法への変換プログラム〕について、(1)〜(3)に答えよ。
問題文を見る(1)本文中のオに入れる適切な数値を答えよ。
模範解答
オ:0
解説
解答の論理構成
- 問題文には「nullがスタックからポップされることがないようにするために、その優先度をオと定義する。」とあります。
- スタックから要素をポップする条件は、アルゴリズム手順(2)の説明と同じくプログラム中でも「スタックの先頭にある演算要素の優先度 ≥ 現在処理中の演算要素の優先度」のときです。
- 表2によれば既存の優先度の最小値は “)” の「1」。したがってnullを決してポップさせないためには、nullの優先度を「1」よりも小さく設定すればよいことになります。
- 非負整数でかつ最小値にしたいので「0」が最適です。
- 以上より、オ には「0」が入ります。
誤りやすいポイント
- nullの役割を「ダミー要素」ではなく「番兵」として理解しないと、優先度を大きくしてしまう誤答が生じやすいです。
- 「1未満にすれば安全」と覚えながらも負の値を想定する受験者がいますが、GetPriorityは「非負の整数」を返す仕様なので負値は選択肢に入りません。
- 表2の優先度を暗記していても、「値が大きいほど優先度が高い」という注記を読み落とし、大小関係を逆に判断するミスも頻発します。
FAQ
Q: nullをスタックに最初から入れる利点は何ですか?
A: スタックが常に少なくとも1要素を持つ状態になるため、空スタック例外の判定処理を書かずに済み、プログラムが簡潔になります。
A: スタックが常に少なくとも1要素を持つ状態になるため、空スタック例外の判定処理を書かずに済み、プログラムが簡潔になります。
Q: nullの優先度を「0」以外の正の値にしても、最後にwhileで取り除くので問題ないのでは?
A: 途中の手順(2)で「≥」比較を行うため、nullの優先度が大きいと途中でポップされ、変換後配列に混入してしまいます。最小値「0」に設定することが安全策です。
A: 途中の手順(2)で「≥」比較を行うため、nullの優先度が大きいと途中でポップされ、変換後配列に混入してしまいます。最小値「0」に設定することが安全策です。
Q: 負の値を使ってはダメですか?
A: GetPriorityの戻り値は「非負の整数」と定義されています。負数は仕様違反になるため使用できません。
A: GetPriorityの戻り値は「非負の整数」と定義されています。負数は仕様違反になるため使用できません。
関連キーワード: スタック, 優先度比較, 番兵, 逆ポーランド変換
設問2:〔逆ポーランド表記法への変換プログラム〕について、(1)〜(3)に答えよ。
問題文を見る(2)本文中のカに入れる適切な字句を20字以内で答えよ。
模範解答
カ:「スタック上に演算要素があるか否か」
または
「スタックが空であるか否か」
解説
解答の導き方
-
問題文の該当箇所を確認します。プログラムの説明に「nullがスタックからポップされることがないようにするために、その優先度をオと定義する。こうすることで、プログラム中、手順(2)の処理を行う部分でカの判定処理を記述する必要がなくなり、プログラムが簡潔になる。」とあります。これは「手順②で通常必要となるある判定」をプログラムで省略できる、という意味です。
-
手順(2)の本文を見ます。そこには「スタック上に演算要素がある場合は、スタックの先頭にある演算要素の優先度を参照し、(1)の演算要素の優先度以上なら、スタックの先頭の演算要素をポップし、変換後配列の末尾に追加する。」とあります。ここの先頭の語句「スタック上に演算要素がある場合は」が、そのままプログラムで判定すべき内容を示しています。つまり手順(2)で必要なのは「スタックに要素があるかどうか(=スタックが空か否か)」を調べることです。
-
図2のプログラムの初期化を見ると、次のようになっています。「stackCount ← 1」「stack[stackCount] ← null」。この初期化によりスタックには常に少なくともダミー要素nullが入っており、明示的に「スタックが空かどうか」をチェックしなくてもスタックの先頭要素に安全にアクセスできます。したがって、手順(2)で本来必要な判定は「スタック上に演算要素があるか否か(=スタックが空であるか否か)」であり、これをダミー要素で代替していることが分かります。
-
ただしダミーのnullがポップされてしまうと意味がなくなるため、nullの優先度は全ての通常の演算要素よりも小さく設定します。図2中のポップループは「while ( ク かつstackTopが "(" 以外の間繰り返す )」の形で優先度比較を行っているため、nullの優先度が最も低ければ優先度比較が偽になり、nullは残ったままループを抜けます。
結論として、カ に入る適切な字句は次のいずれかです。
「スタック上に演算要素があるか否か」または「スタックが空であるか否か」
「スタック上に演算要素があるか否か」または「スタックが空であるか否か」
誤りやすいポイント
-
nullの優先度を「最も高く」設定してしまう誤り
- ポップ条件が「stackTopの優先度がelementの優先度以上ならポップ」であるため、nullの優先度が高いと条件を満たしてnullがポップされ、スタック保護の目的を果たせません。nullは「全ての通常の演算要素より低い優先度」にする必要があります。
-
手順(2)の判定を「トップが '('かどうか」と混同する誤り
- 「トップが '(' の場合はそこで繰り返しを終了する」はポップループ内の追加条件であり、手順(2)冒頭の「スタック上に演算要素がある場合は」とは別のチェックです。前者は括弧処理、後者は空スタックの有無のチェックです。
-
同義語の使い方で減点される心配
- 「スタック上に演算要素があるか否か」と「スタックが空であるか否か」は同義です。どちらを使っても正答とされます(設問の字数制限に収めることだけ注意)。
FAQ
Q: プログラム中で本当に「スタックが空かどうか」を全く書かなくて安全ですか?
A: 図2では初期化で「stackCount ← 1」「stack[stackCount] ← null」としてダミー要素を入れているため、明示的な空チェックは不要です。ダミー要素を入れない実装では空チェックが必須になります。
A: 図2では初期化で「stackCount ← 1」「stack[stackCount] ← null」としてダミー要素を入れているため、明示的な空チェックは不要です。ダミー要素を入れない実装では空チェックが必須になります。
Q: nullの優先度は具体的にどの値にすればよいですか?
A: 表2のように通常の優先度が1以上の範囲で与えられている場合、nullはその最小値より小さい値(例えば0)にするのが分かりやすいです。重要なのは「全ての通常の演算要素より低くする」ことです。
A: 表2のように通常の優先度が1以上の範囲で与えられている場合、nullはその最小値より小さい値(例えば0)にするのが分かりやすいです。重要なのは「全ての通常の演算要素より低くする」ことです。
Q: 設問でどちらの表現を使えば安全ですか?
A: 「スタック上に演算要素があるか否か」も「スタックが空であるか否か」も同義です。読みやすさや字数制限に合わせて選んでください。
A: 「スタック上に演算要素があるか否か」も「スタックが空であるか否か」も同義です。読みやすさや字数制限に合わせて選んでください。
関連キーワード: 逆ポーランド表記法、スタック、演算子優先度、トークン、構文解析
設問2:〔逆ポーランド表記法への変換プログラム〕について、(1)〜(3)に答えよ。
問題文を見る模範解答
キ:stack[stackCount]
ク:GetPriority(stackTop)がelementPriority以上
ケ:GetElement(i)が“)”である
解説
解答の論理構成
-
【問題文】の手順(2)は
“スタックの先頭にある演算要素の優先度を参照し、(1)の演算要素の優先度以上なら、スタックの先頭の演算要素をポップし…”
と指示しています。コードではスタック先頭を変数stackTopに取り込みます。先頭要素は配列stack[] の末尾、すなわち添字stackCountに格納されているので、stack[stackCount] が最適です。
➡︎ キ=stack[stackCount] -
手順(2)の繰返し条件は
“スタックの先頭の演算要素の優先度が、(1)の演算要素の優先度未満になるまで繰り返す”
です。すなわち「まだ優先度が高い(または同じ)ならポップを続行」という意味なので、コードのwhile条件は
GetPriority(stackTop) がelementPriority以上
となります。
➡︎ ク=GetPriority(stackTop)がelementPriority以上 -
手順(3)の冒頭には
“参照した演算要素が“ ) ”なら、それを破棄し…”
とあります。コード側のif判定はこの条件に対応するため、
GetElement(i) が “)” である
が入ります。
➡︎ ケ=GetElement(i)が“)”である
以上より、
キ:stack[stackCount]
ク:GetPriority(stackTop)がelementPriority以上
ケ:GetElement(i)が“)”である
キ:stack[stackCount]
ク:GetPriority(stackTop)がelementPriority以上
ケ:GetElement(i)が“)”である
誤りやすいポイント
- スタックの先頭をstack[1] と勘違いする
- 本プログラムは「右端が先頭」方式です。stackCountが現在のトップであることを忘れやすいので注意。
- while条件を「>」と書いてしまう
- 手順(2)は“以上ならポップ”なので「=」も含めて比較する必要があります。
- “ ) ” 判定をstackTopに対して行うミス
- 手順(3)はあくまで“(1)で参照した演算要素”の判定です。スタックトップではありません。
FAQ
Q: nullを最初にプッシュする理由は何ですか?
A: スタックを空にする特別な判定を省くためです。nullの優先度を最低にしておけば、誤ってポップされることがありません。
A: スタックを空にする特別な判定を省くためです。nullの優先度を最低にしておけば、誤ってポップされることがありません。
Q: 優先度表で“ア〜エ”に具体的な演算子が示されていませんが影響しますか?
A: 本設問は変数名の補完が目的なので、具体的な演算子は必要ありません。優先度整数だけで処理できます。
A: 本設問は変数名の補完が目的なので、具体的な演算子は必要ありません。優先度整数だけで処理できます。
Q: “ ) ” を検出したらスタックから “ ( ” を取り除くのはなぜ?
A: 括弧は逆ポーランド表記に現れないためです。“ ( ” から “ ) ” までの演算子は既にポップ済みなので、括弧自体は破棄します。
A: 括弧は逆ポーランド表記に現れないためです。“ ( ” から “ ) ” までの演算子は既にポップ済みなので、括弧自体は破棄します。
関連キーワード: スタック, 優先度比較, 逆ポーランド記法, パーサ, アルゴリズム
設問3:
問題文を見る模範解答
コ:Err
サ:OK
シ:OK
ス:Err
解説
解答の論理構成
- 【問題文】では、入力エラーの判定基準として「数値の演算要素が2個以上連続する場合」や「“ ) ” の直後に “ ( ” が続く場合」を例示しています。これは「同じ種類の演算要素が連続する」「演算子同士が連続する」など、数学的に項が不足するパターンを全て排除する方針だと分かります。
- 表4の行「4 (数値)」×列「4 (数値)」は “数値 → 数値” の並びです。先述の連続数値禁止より【コ】はErrとなります。
- 同じ行の列「2 (ウ, エ)」は “数値 → 加減算演算子” の並びです。演算子が後ろに来るのは正しい式の形なので【サ】はOKになります。
- 行「3 (ア, イ)」×列「4 (数値)」は “乗除演算子 → 数値” の並びです。演算子の直後に数値が来るのは正常なので【シ】はOKです。
- 同じ行の列「2 (ウ, エ)」は “乗除演算子 → 加減算演算子” という “演算子 → 演算子” の並びに該当します。被演算子が欠けているため【ス】はErrになります。
以上より
コ:Err
サ:OK
シ:OK
ス:Err
コ:Err
サ:OK
シ:OK
ス:Err
誤りやすいポイント
- 「数値の後ろには必ず演算子か “ ) ” が来る」と覚えていないと、4 → 4を誤ってOKとしてしまう。
- 「演算子の後ろには必ず数値か “ ( ” が来る」ルールを忘れると、演算子 → 演算子 のケースを見落としやすい。
- 優先度の大小に気を取られ、そもそもの“式としての並び”を確認し忘れると判断を誤る。
FAQ
Q: 優先度が高いか低いかはエラーチェックに影響しますか?
A: いいえ、表4では“並びの種類”がポイントです。同じ「演算子 → 演算子」でも優先度が違ってもエラーになります。
A: いいえ、表4では“並びの種類”がポイントです。同じ「演算子 → 演算子」でも優先度が違ってもエラーになります。
Q: “数値 → “)”” の並びはOKなのですか?
A: はい。閉じ括弧は直前の項をまとめる記号なので、“数値 → “)”” は正しい並びと判定しています(表4の該当セルはOK)。
A: はい。閉じ括弧は直前の項をまとめる記号なので、“数値 → “)”” は正しい並びと判定しています(表4の該当セルはOK)。
Q: “( → 数値” がOKなのはなぜ?
A: “(” は数値や “(” を開始できるので、“( → 数値” は通常の括弧開始として正しいためOKです。
A: “(” は数値や “(” を開始できるので、“( → 数値” は通常の括弧開始として正しいためOKです。
関連キーワード: 逆ポーランド, スタック, 演算子優先度, 構文解析, 入力検証






