web-dev-qa-db-ja.com

なぜ接頭表記、接尾表記が必要なのですか

それぞれをどのように相互に変換できるかは知っていますが、実際のアプリケーションが何であるかを理解していません。通常のインフィックス操作は非常に読みやすいですが、どこで失敗するかで、プレフィックスとポストフィックスの表記が始まりました。

29

接頭辞表記はhum​​ansの場合は読みやすいですが、前置/後置表記はマシンで解析する方が簡単です。 pre/postfix表記の大きな利点は、演算子の優先順位などの質問が発生しないことです。

たとえば、中置式1 # 2 $ 3を考えてみます。現在、これらの演算子の意味がわからないため、対応する2つの後置式があります:1 2 # 3 $1 2 3 $ #。これらの演算子の使用を管理する規則を知らなければ、中置式は本質的に価値がありません。

または、より一般的に言えば、追加の知識がなくても、前置/後置式から元の(解析)ツリーを復元することは可能ですが、中置式については同じことが言えません。

43
Jan Krüger

[〜#〜] rpn [〜#〜] とも呼ばれるPostfix表記は、左から右への処理が非常に簡単です。オペランドはスタックにプッシュされます。演算子は、そのオペランドをスタックからポップし、結果をプッシュします。解析はほとんどまたはまったく必要ありません。これは、Forthおよび一部の計算機で使用されます(HP計算機はRPNを使用するために注記されています)。

プレフィックス表記は、処理がほぼ同じです。 LISPで使用されます。

2
Keith Thompson

少なくともプレフィックス表記の場合:プレフィックス演算子を使用する利点は、構文的には、演算子が関数呼び出しであるかのように読み取れることです。

1
beefyhalo

プレフィックス/ポストフィックスとインフィックスのもう1つの側面は、演算子のアリティ(適用される引数の数)を厳密に2に制限する必要がなくなったことです。当然のことながら、加算/減算のゼロ、乗算/除算のゼロなど)。

1
Brian T. Rice

中置式の場合、評価に要する時間はO(n ^ 2)です。理由は演算子の優先度です。例:a + b * cこれでは、a + bを直接評価しません。まず、式全体を走査して、最も優先順位の高い演算子を見つけます。私たちの場合は*なので、最初にb * cを評価し、式を完全に評価するまで同じ手順を繰り返します

しかし、これは後置または中置式の場合はそうではありません。 postfix式の評価に必要な時間はO(n)です

後置から後置への変換==== O(n) Postfix評価==== O(n)

合計時間= O(n) + O(n)= O(n)

後置評価の場合、演算子の優先順位について考える必要はありません。書くために左から評価する必要があるだけです

同様に、プレフィックス式の場合、右から左に評価する必要があります

0
Nobin sahu