コンピューター, ソフトウェア
RPN:アルゴリズム、方法および実施例
RPNは、かつて世界でコンピュータープログラマーの基礎を形成しました。 今日は、それは非常によく知られていません。 そのため、外部の「逆」ポーランドのソーセージロールを描いた漫画イラストは、まだいくつかの知識豊富なプログラマが誤解することができます。 非常によく冗談を説明するが、この場合には、それは完全に正当化されるわけではありません。
中置
すべてのプログラマー、そしてほとんどの学生は、事業者の使用に精通しています。 例えば、変数xとyの式x +加算値は、プラス記号を使用します。 あまり知られ、これは中置記法と呼ばれる数学表記、から借りているという事実は、実際には、マシンのための大きな問題です。 入力2つの値は左と右に記録されているように、この操作者が受け取ります。 プログラミング表記で標識操作で任意に使用。 例えば、X + Yは、最終的に、コンパイラとは中置表記に変換する倍(x、y)の関数として書くことができます。 しかし、誰もが数学はほぼすべてのプログラミング言語で内部のミニ言語の種類を形成する算術式を、使用しないようにあまりにも良いであることを知っています。
式トランスレータ
最初は本当に成功したのFortranプログラム言語となっていますので、主な理由は、コードで(放送)に変換算術式(すなわち式...)、それの名前の由来 - フォーミュラ翻訳。 それに先立って、それらは、例えば、書き込み機能の形に折り畳まなければならなかった((及び乗算B、C))。 プログラマがCでB Mutliplyへ追加のようなものを書かなければならなかったので、COBOLで自動変換式を実装の問題は非常に難しいと考えられていました
中置の何が問題になっているのですか?
問題は、事業者が優先順位と結合などの特性を持っていること、です。 このため、中置関数の定義は、非自明なタスクになります。 例えば、乗算は、左から右へのオペレータの性能であるように式2 + 3 * 4は、4を乗じ2と3の和に等しくないことを意味する加減算より高い優先順位を有します。 実際には、4 3を乗算および2を追加この例では、中置式の計算は、多くの場合、演算子およびオペランドの順序の変更を必要とすることを示しています。 また、より明確に表記法を探すために括弧を使用する必要があります。 2 + 3 * 4 + 5は、あなたが4で3を乗算し、2と5を追加する必要があることを意味するので。例えば、(2 + 3)*(4 + 5)は、括弧なしで書き込むことができません
あなたは演算子を計算する順序は長く覚えが必要です。 このため、多くの場合、算術演算を学び始める学生は、実際の操作が正しく実行される場合でも、間違った結果を取得します。 心でアクション文の順序を教えることが必要です。 まず、アクションは括弧、その後、乗算、除算、最後に加算と減算で行わなければなりません。 しかし、中置記法だけよりに追加することができる可能「小さな言語」の一つであるとして、数式を書くの別の方法があります。
接頭辞と接尾表記
最もよく知られている選択肢の二つは、そのオペランドの前か後にオペレータを記録することです。 彼らは、接頭辞と接尾表記として知られています。 論理学者ヤン・ルーカシビック 1920年に最初のものを発明しました。 彼はポーランドに住んでいたので、レコードがポーランドと呼ばれています。 Postfixバージョンは、それぞれ、逆ポーランド記法(ARF)と呼ばれます。 それは詳細それらの一方のみに考慮すればよいので、これらの2つの方法の間の唯一の違いは、(左から右または左に右に)レコードを読み取る方向です。 OPN演算子は、そのオペランドの後に書かれています。 したがって、式AB +は、A + Bの例RPNを表します
オペランドの数は無制限
表記の直接的な利点は、それがn進演算子と中置表記は実際には2つのオペランドトンと連携でまとめたということである。E.のみバイナリ操作のために本質的に適しています。 例えば、ABCは、@演算子三個のオペランド自体の左側に作用し、関数呼び出し@(A、B、C)に対応する。この場合、A、BおよびCの最大値である三つ組みのマークを使用して、逆ポーランド式です。 あなたは、このような@のBCまたはそのような何かとして、中置として@記号を書き込みしようとした場合、それは単に動作しないことが明らかになりました。
順番で優先
RPNは、オペレータの優先順位は、それらの出現の順序で表すことができることは別の利点をに有します。 彼らは中置記法の変換を容易にするために、文字操作として含まれ得るが、同時に、中括弧を必要としません。 例えば、AB + C * - 明白な等価(A + B)* Cので、乗算は乗算の第二オペランドを与える、実行添加まで算出することができません。 >(AB +)* C - - >(A + B)* Cで算出されたAB + C *は一度に一のオペレータによって、我々はAB + C *を取得する場合には、あります
計算アルゴリズム
OPN演算子は、彼女の左側に書かれた引数2つの値として取る関数と同じように見えます。 その計算の方法は、スタック動作に対応し、解析の必要性が排除されるように加えて、それは、プログラミング言語で使用するための自然な表記法です。 例えば、発現のアレスタ5 + 6 * 7は、5、6、7 *、+として表示され、それは左から右に走査することによって簡単に計算され、スタックに値を書き込むことができます。 コンピュータメモリの上側要素2によって選択された動作のたびに、共通符号、オペレータが使用され、結果はメモリに戻されます。 場合の計算式の最終結果は、スタックの最上部にあります。
例えば:
- S =()5、6、スタック上に配置された7、*、+ 5。
- スタック上に配置されたS =(5)6、7、*、+ 6。
- Sは、=(5、6)、7 * 7 +スタックを置きます。
- S =(5、6、7)、* 2 +、スタックから値を選択して使用*、スタックに結果を置きます。
- S =(5、6×7)=(5、42)+ +を適用し、スタックに結果を置くために、スタックから選択される2つの値。
- S =(5 + 42)=(47)の計算が完了し、結果はスタックの一番上に格納されています。
このアルゴリズムは、繰り返しRPNを確認することができますが、それぞれの時間は、それがどんなに複雑な算術式、動作しません。
OPNおよびスタックが密接に関連しています。 この例は、逆ポーランド記法の値を計算するためにメモリを使用する方法を示します。 あまり目立たないあなたは、急性腎不全に標準中置式を変換し、スタックを使用することができるということです。
プログラミング言語の例
これは、(プログラムの一部を示している)のようなパスカルRPNを実現します。
トークン番号又は記号操作か否かを判定する手順と呼ばれる周期で数値と演算子を読み取ります。 最初のケースでは、スタックに格納された値、及び2つの上部スタック番号対応するアクションの第二が行われ、結果が格納されます。
toktype:= NUM;
(S)読み取ります。
C言語であれば[ '+'、 ' - '、 '*'、 '/']、その後始まります
eolnならば、CN:= '' 他に(CN)を読みます。
もしCN =「」その後、
の場合
'+':Toktype:=追加します。 ' - ':toktype:=副。
'*':Toktype:= MUL; '/':Toktype:= DIV
終了
他の開始
もし= ' - ' をSGN:= -1他のエラー:= C <> '+';
:= CN
終了
エンド;
(ないエラー)および(toktype = NUM)次にはgetNumber場合。
toktype <> numが、その後始める場合
Y =ポップ。 X:=ポップ。
その後、エラーではない場合
のtoktype場合
追加:Z = X + Y。 サブ:Z:=のX-Y。 MUL:Z = X * Y。 DIV:Z = X / Y
終了
プッシュ(Z)。
C-実装RPN(プログラムの示す部分):
{(S =はstrtok(0)、W S =はstrtok(S、W); S)のための
=は、strtod(S、&E)。
IF(E> S)プッシュ(A)。
#define rpnop(X)のprintf( "%のC:"、* S)、B =ポップ()、=ポップ()、プッシュ(X)
それ以外の場合(* S == '+')rpnop(A + B)。
それ以外の場合(* S == ' - ')rpnop( - B)。
それ以外の場合(* S == '*')rpnop(* b)は、
他rpnop(A / B)(* S == '/')であれば、
#undefのrpnop
}
ハードウェア実装
当時、コンピュータ技術は非常に高価だったとき、それは、避雷器を使用する人々を強制的に良いアイデアを考えられていました。 1960居住では、今のように、逆ポーランド記法で働く電卓を購入することが可能でした。 それらの2と3を追加するには、その後3、2を入力し、「プラス」ボタンを押す必要があります。 一見すると、オペレータへの入力オペランドは覚え複雑で困難なように見えたが、しばらくした後、いくつかは、この考え方にはまっており、他の人はとても複雑であり、そのように限定されるものである愚かな中置、を主張する理由を理解できませんでした。
バロウズの会社でも、スタックを除いて、他のメモリを持っていたメインフレームを、構築されました。 マシンを作る唯一のものは - 中央スタックにアルゴリズムや方法RPNを適用します。 その操作の全ては、上部n値に適用アレスタ演算子、としました。 例えば、より一般的なアーキテクチャーと競合しないように十分に速くチームは、スタックの最上位からのリターンアドレスを取った、というように。D.、このようなマシンのアーキテクチャはシンプルだったが、。 多くの、しかし、まだすべてのプログラムは、OPNの発現したコンピューティングへのそのようなシンプルかつエレガントなアプローチは、その継続を見つけたという事実を後悔。
RPNとワンタイム電卓は人気があった、と一部の人々はまだ彼らに好みを与えます。 また、彼らは、フォースとしてスタック指向言語を開発しました。 今日では、ほとんど使用されますが、彼の前のユーザーからまだ懐かしいです。
だから、逆ポーランドソーセージに関する意味のジョークは何ですか?
我々は、ソーセージのオペレータは、中置記法は、それが従来のホットドッグのようにロール内でなければならないと仮定した場合。 RPNは、二つの半分は、計算後の準備ができて、その間を取得し、右に位置しています。 マスタード - 今、難しい部分が来ます。 彼女は、ソーセージにすでにすでに単項演算子として計算トン。E.です。 あまりにも大きなスタックを必要とする、マスタードとしても未計算示すべきであると考えられているため、ソーセージの右側に移動する必要があります...しかし、それは可能です...
Similar articles
Trending Now