中置記法から後置記法への変換を理解する前に、中置記法と後置記法について別々に知っておく必要があります。
中置子と後置子は式です。式は定数、変数、シンボルで構成されます。記号には演算子または括弧を使用できます。これらすべての式を一連のルールを使用して評価できるように、これらすべてのコンポーネントを一連のルールに従って配置する必要があります。
式の例は次のとおりです。
5+6
A~B
配列リストのソート
(P*5)
上記の式はすべて共通の構造を持っています。つまり、2 つのオペランドの間に演算子があります。オペランドは、操作が実行されるオブジェクトまたは値です。上記の式では、5、6 がオペランド、「+」、「-」、および「*」が演算子です。
中置記法とは何ですか?
演算子がオペランドの間に記述される場合、それは次のように呼ばれます。 中置記法 。オペランドは必ずしも定数または変数である必要はありません。式自体にすることもできます。
例えば、
(p + q) * (r + s)
上の式では、乗算演算子の両方の式がオペランドです。つまり、 (p + q) 、 そして (r + s) はオペランドです。
上の式には 3 つの演算子があります。最初のプラス演算子のオペランドは p と q で、2 番目のプラス演算子のオペランドは r と s です。を実行しながら、 式に対する操作では、結果を評価するためにいくつかのルールに従う必要があります。の中に 上の式では、2 つの式、つまり p+q と r+s に対して加算演算が実行され、次に乗算演算が実行されます。
中置記法の構文は次のとおりです。
式に演算子が 1 つだけある場合は、ルールを適用する必要はありません。たとえば、5 + 2;この式では、2 つのオペランド (5 と 2) の間で加算演算を実行でき、演算結果は 7 になります。
式に複数の演算子がある場合、式を評価するには何らかのルールに従う必要があります。
式が次の場合:
電子バンキングの制限
4+6*2
プラス演算子が最初に評価される場合、式は次のようになります。
10 * 2 = 20
乗算演算子が最初に評価される場合、式は次のようになります。
DSにスタックする
4 + 12 = 16
上記の問題は、演算子の優先順位規則に従うことで解決できます。代数式における演算子の優先順位は、次の表に示されています。
オペレーター | 記号 |
---|---|
括弧 | ( )、{}、[ ] |
指数 | ^ |
掛け算と割り算 | *、/ |
加減 | +、- |
最初に優先されるのは括弧です。次に指数が優先されます。複数の指数演算子の場合、演算は右から左に適用されます。
例えば:
2^2^3 = 2^8
= 256
指数、乗算、除算の演算子が評価された後。両方の演算子が式に存在する場合、演算は左から右に適用されます。
次に優先されるのは加算と減算です。両方の演算子が式で使用できる場合は、左から右に進みます。
同じ優先順位を持つ演算子は、 演算子の結合性 。左から右に進む場合、それは左連想として知られています。右から左に進む場合、それは右連想として知られています。
中置記法の問題
中置式を評価するには、次のことについて知っておく必要があります。 演算子の優先順位 ルールに従う必要があり、演算子の優先順位が同じである場合は、次の規則に従う必要があります。 結合性 ルール。中置記法では、演算の実行順序を制御するために括弧の使用が非常に重要です。括弧を使用すると式が読みやすくなります。中置式は式を記述する最も一般的な方法ですが、曖昧さなしに中置式を解析して評価するのは簡単ではありません。そこで、数学者と論理学者はこの問題を研究し、式を記述する別の 2 つの方法、つまり接頭辞と接尾辞を発見しました。どちらの式も括弧を必要とせず、曖昧さなく解析できます。演算子の優先順位や結合規則は必要ありません。
後置式
後置式は、オペランドの後に演算子を記述する式です。たとえば、中置記法の後置式 ( 2+3) は 23+ と書くことができます。
リストから配列Javaへ
後置式に関する重要なポイントは次のとおりです。
- 後置式では、左から右に書いた順に演算が行われます。
- 括弧は必要ありません。
- 演算子の優先順位ルールや結合性ルールを適用する必要はありません。
後置式を評価するアルゴリズム
- 演算子が見つかるまで、式を左から右にスキャンします。
- 操作を実行する
- 式を計算された値に置き換えます。
- 演算子がなくなるまで 1 から 3 の手順を繰り返します。
例を通して上記のアルゴリズムを理解してみましょう。
中置式: 2 + 3 * 4
式の左端からスキャンを開始します。乗算演算子は、左から右にスキャンするときに最初に現れる演算子です。ここで、式は次のようになります。
式 = 2 + 34*
= 2 + 12
もう一度、左から右にスキャンすると、式は次のようになります。
式 = 2 12 +
= 14
スタックを使用した後置式の評価。
- 式を左から右にスキャンします。
- 式内でオペランドが見つかった場合は、そのオペランドをスタックにプッシュします。
- 式内で演算子が見つかった場合は、対応するオペランドをスタックからポップします。
- 式のスキャンが終了すると、最終的な値がスタックに残ります。
スタックを使用した後置式の評価を理解しましょう。
例 1: 後置式: 2 3 4 * +
入力 | スタック | |
---|---|---|
2 3 4 * + | 空の | プッシュ2 |
3 4 * + | 2 | プッシュ 3 |
4*+ | 3 2 | プッシュ4 |
* + | 4 3 2 | 4 と 3 をポップし、4*3 = 12 を実行します。12 をスタックにプッシュします。 |
+ | 12 2 | スタックから 12 と 2 をポップし、12+2 = 14 を実行します。14 をスタックにプッシュします。 |
上記の式の結果は 14 になります。
例 2: 後置式: 3 4 * 2 5 * +
入力 | スタック | |
---|---|---|
3 4 * 2 5 * + | 空の | プッシュ 3 |
4*2 5*+ | 3 | プッシュ4 |
*2 5 * + | 4 3 | スタックから 3 と 4 をポップし、3*4 = 12 を実行します。12 をスタックにプッシュします。 |
2 5 * + | 12 | プッシュ2 |
5*+ | 2 12 | プッシュ5 |
*+ | 5 2 12 | スタックから 5 と 2 をポップし、5*2 = 10 を実行します。10 をスタックにプッシュします。 |
+ | 10 12 | スタックから 10 と 12 をポップし、10+12 = 22 を実行します。22 をスタックにプッシュします。 |
上記の式の結果は 22 です。
c ブール値
後置式を評価するアルゴリズム
- 文字を読む
- 文字が数字の場合は、文字を int に変換し、整数をスタックにプッシュします。
- キャラクターが演算子の場合、
- スタックから要素を 2 回ポップし、2 つのオペランドを取得します。
- 操作を実行する
- 結果をスタックにプッシュします。
インフィックスからポストフィックスへの変換
ここでは、中置式から前置式への変換にスタック データ構造を使用します。オペレーターが遭遇するたびに、オペレーターをスタックにプッシュします。オペランドが見つかった場合は、そのオペランドを式に追加します。
中置式から後置式への変換の規則
- オペランドが到着したらそれを出力します。
- スタックが空であるか、上部に左括弧が含まれている場合は、受信した演算子をスタックにプッシュします。
- 受信シンボルが '(' の場合、それをスタックにプッシュします。
- 受信シンボルが ')' の場合、スタックをポップし、左括弧が見つかるまで演算子を出力します。
- 受信シンボルの優先順位がスタックの最上位よりも高い場合は、それをスタックにプッシュします。
- 受信シンボルの優先順位がスタックの最上位よりも低い場合は、スタックの最上位をポップして出力します。次に、受信した演算子をスタックの新しい最上位に対してテストします。
- 入力演算子がスタックの最上位と同じ優先順位を持つ場合は、結合規則を使用します。結合性が左から右の場合は、スタックの一番上をポップおよび出力してから、入力された演算子をプッシュします。結合性が右から左の場合は、入力された演算子をプッシュします。
- 式の最後で、スタックのすべての演算子をポップして出力します。
例を通して理解しましょう。
中置式: K + L - M*N + (O^P) * W/U/V * T + Q
入力式 | スタック | 後置式 |
---|---|---|
K | K | |
+ | + | |
L | + | KL |
- | - | KL+ |
M | - | KL+M |
* | -* | KL+M |
N | -* | KL+MN |
+ | + | KL+MN* K L + M N* - |
( | + ( | K L + M N *- |
○ | + ( | K L + M N * - O |
^ | +(^ | K L + M N* - O |
P | +(^ | K L + M N* - O P |
) | + | K L + M N* - O P ^ |
* | + * | K L + M N* - O P ^ |
で | + * | K L + M N* - O P ^ W |
/ | + / | K L + M N* - O P ^ W * |
で | + / | K L + M N* - O P ^W*U |
/ | + / | K L + M N* - O P ^W*U/ |
で | + / | KL + MON*-UP^W*U/F |
* | + * | KL+MON*-UP^W*U/F/ |
T | + * | KL+MN*-UP^W*U/F/T |
+ | + | KL+MON*-UP^W*U/F/T* KL+MN*-UP^W*U/F/T*+ |
Q | + | KL+MN*-OP^W*U/V/T*Q |
KL+MN*-OP^W*U/V/T*+Q+ |
中置式(K + L - M*N + (O^P) * W/U/V * T + Q) の最後の後置式は、KL+MN*-OP^W*U/V/T*+Q+ です。 。