777 Shares 6396 views

RPN: Algorithmus, Methoden und Beispiele

RPN gebildet, sobald die Grundlage eines Computer-Programmierer in der Welt. Heute ist es nicht so gut bekannt. Daher Comic-Illustration, eine „umgekehrte“ polnische Wurstrollen darstellt außen, kann immer noch durch einige gut ausgebildete Programmierer falsch verstanden werden. Nicht sehr gut erklären, den Witz, aber in diesem Fall wird es völlig gerechtfertigt.

Infix

Alle Programmierer, und die meisten Studenten sind vertraut mit der Verwendung von Operatoren. Zum Beispiel kann der Ausdruck x + Summenwerte für die Variablen x und y gebrauchte Pluszeichen. Weniger bekannt ist die Tatsache, dass diese aus der Mathematik Notation entlehnt sind, Infixschreibweise genannt, in der Tat ein großes Problem für die Maschinen ist. Dieser Operator empfängt als Eingabe zwei Werte werden auf der linken und rechten aufgezeichnet. In Programmierung Notation optional mit Zeichen-Operationen. Zum Beispiel kann x + y als eine Funktion der fold (x, y) geschrieben werden, in der der Compiler und schließlich Infix-Schreibweise umwandelt. Aber jeder weiß, die Mathematik zu gut ist, nicht arithmetische Ausdrücke zu verwenden, das eine Art interner Mini-Sprache bildet in fast jeden Programmiersprache.

Formel Übersetzer

Der erste wirklich erfolgreiche Programmiersprache Fortran hat so weitgehend, weil der arithmetischen Ausdruck (dh Formel ..) wird es (Broadcast) im Code umgewandelt, daher der Name es – FORmula Übersetzung. Davor, mußte sie schreiben, beispielsweise in Form von Funktionen gefaltet (und multiplizieren (b, c)). In COBOL Problem der automatische Umrechnungsformel Implementierung wurde als sehr schwierig, da die Programmierer Dinge zu schreiben hatten wie hinzufügen A nach B Mutliply Von C.

Was ist los mit Infix?

Das Problem ist, dass die Betreiber solcher Eigenschaften wie Vorrang und Assoziativität haben. Aus diesem Grunde wird die Definition von Infix Funktion nicht-triviale Aufgabe. Zum Beispiel hat die Multiplikation höhere Priorität als eine Addition oder Subtraktion, was bedeutet, dass der Ausdruck 2 + 3 * 4 von 4 nicht gleich die Summe von 2 und 3, multipliziert wird, wie es in der Leistung der Betreiber wäre, von links nach rechts. In der Tat, multiplizieren 3 von 4 und fügt 2. Dieses Beispiel zeigt, dass die Berechnung des Infix Ausdrucks oft eine Änderung der Reihenfolge der Operatoren und Operanden erfordert. Darüber hinaus ist es notwendig, Klammern zu verwenden klare Notation zu suchen. Zum Beispiel (2 + 3) * (4 + 5) kann nicht ohne Klammern geschrieben werden, da 2 + 3 * 4 + 5 bedeutet, dass Sie 3 von 4 und fügen Sie 2 und 5 multiplizieren müssen.

Die Reihenfolge, in der die Betreiber berechnen möchten erfordert eine lange erinnern. Aus diesem Grunde, Studenten, die Arithmetik zu lernen beginnen, bekommen oft die falschen Ergebnisse, auch wenn die tatsächlichen Vorgänge korrekt ausgeführt werden. Es ist notwendig, die Reihenfolge der Aktionsanweisungen auswendig zu lehren. Erstens muss die Aktion in Klammern durchgeführt wird, dann Multiplikation und Division und schließlich Addition und Subtraktion. Aber es ist eine andere Art und Weise mathematische Ausdrücke des Schreibens als Infixschreibweise nur eine der möglichen „kleinen Sprachen“ ist, die zu mehr hinzugefügt werden können.

Präfix und Postfix-Notation

Zwei der bekanntesten Alternativen ist der Bediener vor oder nach seiner Operanden aufzunehmen. Sie werden als Präfix und Postfix-Notation bekannt. Logiker Yan Lukasevich erfand die erste im Jahr 1920. Er lebte in Polen, so wird der Datensatz Polnisch genannt. Postfix-Version bzw. Reverse Polish Notation (ARF) genannt. Der einzige Unterschied zwischen diesen beiden Verfahren ist die Richtung, in der die Aufzeichnung zu lesen (von links nach rechts oder von rechts nach links), so dass es nur eine von ihnen im Detail zu betrachten genügt. Der OPN Operator wird nach seinen Operanden geschrieben. Somit stellt der Ausdruck AB + ein Beispiel RPN für A + B.

Unbegrenzte Anzahl von Operanden

Der unmittelbare Vorteil der Notation ist, dass es den n-adische Operator und Infixschreibweise fasst wirklich funktioniert nur mit zwei Operanden, t. E. ist von Natur aus geeignet nur für binäre Operationen. Zum Beispiel ist ABC @ der umgekehrte polnische Ausdruck triadischen Zeichen verwendet, die der Maximalwert von A, B und C. In diesem Fall ist der Bediener auf der linken Seite der drei Operanden wirkt selbst und entsprechen einen Funktionsaufruf @ (A, B, C). Wenn Sie versuchen, das @ -Zeichen als Infix, wie A @ BC oder so etwas zu schreiben, wird klar, dass es einfach nicht funktioniert.

Die Priorität von der angegebenen Reihenfolge

RPN hat einen weiteren Vorteil, dass die Priorität der Betreiber durch die Reihenfolge ihres Erscheinens vertreten sein. Zur gleichen Zeit müssen nie Klammern, obwohl sie enthalten sein können, als Zeichen Operationen die Umwandlung von Infixschreibweise zu erleichtern. Zum Beispiel AB + C * – eindeutige Äquivalent (A + B) * C, so dass die Multiplikation kann erst die Zugabe durchgeführt berechnet werden, die einen zweiten Operanden zur Multiplikation ergibt. Das heißt, wenn die berechnete AB + C * von einem Bediener zu einem Zeitpunkt, wir AB + C * erhalten -> (AB +) * C -> (A + B) * C.

Berechnungsalgorithmus

Der OPN Operator sieht genauso aus wie eine Funktion, die auf der linken als Argument zwei Werte geschrieben nimmt. Darüber hinaus ist es eine natürliche Notation für den Einsatz in Programmiersprachen, wie die Art und Weise der Berechnung dieses Anteils auf die Stapeloperationen und die Notwendigkeit für die Analyse entspricht, wird eliminiert. Zum Beispiel, + der Ableiter im Ausdruck 5 6 * 7 erscheint als 5, 6, 7 *, +, und es kann einfach durch das Scannen von links nach rechts berechnet werden und den Werten in einem Stapel schreiben. Jedes Mal, wenn ein gemeinsames Zeichen des Betriebes ausgewählt wird, durch das obere Element 2 des Computerspeichers, der Operator verwendet wird und das Ergebnis zurück in dem Speicher. Wenn das Ergebnis der Berechnung Ausdruck wird in der Spitze des Stapels sein.

Zum Beispiel:

  • S = () 5, 6, 7, *, + 5 auf dem Stapel abgelegt.
  • S = (5), 6, 7, *, + 6 auf den Stapel gelegt.
  • S = (5, 6), 7 *, 7 + den Stapel legen.
  • S = (5, 6, 7), * 2 + wählen Werte aus dem Stapel, * und das Ergebnis in dem Stapel platzieren.
  • S = (5, 6 * 7) = (5, 42) + 2-Werte von dem Stapel ausgewählt, die + zu übernehmen und das Ergebnis in dem Stapel gelegt.
  • S = (5 + 42) = (47) Die Berechnung abgeschlossen ist, wird das Ergebnis in der Spitze des Stapels gespeichert.

Dieser Algorithmus kann RPN werden wiederholt überprüft, aber jedes Mal, es wird funktionieren, egal wie komplex der arithmetischen Ausdruck.

OPN und Stapel eng miteinander verbunden sind. Dieses Beispiel zeigt, wie Sie den Speicher verwenden, um den Wert der Reverse Polish Notation zu berechnen. Weniger offensichtlich ist, dass Sie den Stapel verwenden können, Standard Infix Ausdruck in akutem Nierenversagen zu konvertieren.

Beispiele für Programmiersprachen

Pascal RPN realisiert wie folgt aus (zeigt den Teil des Programms).

Um die Zahlen und Operatoren im Zyklus aufgerufen Verfahren gelesen, die ob der Token-Nummer oder Zeichen Operation bestimmt. Im ersten Fall wird der Wert in dem Stapel gespeichert ist, und der zweite der beiden oberen Stapel Nummern entsprechenden Aktion durchgeführt und das Ergebnis gespeichert wird.

toktype: = num;

Lesen (s);

wenn c in [ '+', '-', '*', '/'] dann beginnen

wenn Eoln dann cn: = '' else lesen (cn);

wenn cn = ‚‘ dann

Fall eines

'+': Toktype: = hinzuzufügen; '-': toktype: = sub;

'*': Toktype: = mul; '/': Toktype: = div

Ende

sonst beginnen

wenn a = '-' dann sgn: = -1 sonst Fehler: = c '+';

mit: = cn

Ende

Ende;

if (keine Fehler) und (toktype = num) dann getNumber;

wenn toktype num dann beginnen

y = Pop; x: = Pop;

wenn nicht fehler dann

Fall toktype von

hinzu: z: = x + y; sub: z: = x-y; mul: z: = x * y; div: z: = x / y

Ende

push (z);

C-Implementierung RPN (gezeigt ein Teil des Programms):

für (s = strtok (s, w); s; s = strtok (0, w)) {

a = strtod (s, & E);

if (e> s) push (a);

#define rpnop (x) printf ( "% c", * n), b = pop (), a = pop (), push (x)

wenn andere (* s == '+') rpnop (a + b);

wenn andere (* s == '-') rpnop (a – b);

wenn andere (* s == '*') rpnop (a * b);

wenn andere (* s == '/') rpnop (a / b);

#undef rpnop

}

Hardware-Implementierungen

In jenen Tagen, als Computer-Technologie sehr teuer war, war es eine gute Idee, dachten die Leute zu zwingen, Überspannungsableiter zu verwenden. 1960-er Jahren., Wie jetzt, war es möglich, die Rechner zu kaufen, die in umgekehrter Richtung polnische Notation arbeiten. So fügen Sie 2 und 3 von ihnen müssen 2 eingeben, dann 3, und drücken Sie die „Plus“ -Taste. Auf den ersten Blick sind die Eingangsoperanden an den Betreiber schien kompliziert und schwer zu merken, aber nach einer Weile einige sind auf diese Denkweise süchtig und konnte nicht verstehen, warum die anderen auf dumme Infix bestehen, die so kompliziert ist, und so ist begrenzt.

Burroughs Unternehmen sogar einen Mainframe gebaut, die keinen anderen Speicher hatte, außer Stapel. Das einzige, was die Maschine macht – angewandt, um die Algorithmen und Methoden RPN zum zentralen Stapel. Alle ihre Operationen wurden als Ableiter Betreiber angesehen, die zu den oberen n Werte gilt. Zum Beispiel nahm das Team die Rücksendeadresse von der Oberseite des Stapels, und so weiter. D. Die Architektur einer solchen Maschine war einfach, aber nicht schnell genug, um mit den häufigeren Architekturen zu konkurrieren. Viele jedoch bedauern immer noch die Tatsache, dass eine solche einfache und elegante Ansatz Computing, wo jedes Programm ein Ausdruck von OPN war, seine Fortsetzung gefunden.

Einmal Rechner mit RPN waren beliebt, und einige Leute sie immer noch den Vorzug geben. Darüber hinaus entwickelten sie eine stapelorientierte Sprachen wie Forth. Heute ist es wenig genutzt, aber immer noch nostalgisch von seinem ehemaligen Nutzer.

Also, was ist die Bedeutung Witze über Reverse Polish Wurst?

Wenn wir davon ausgehen, dass der Betreiber der Wurst, die Infixschreibweise, es innerhalb der Rolle, wie bei herkömmlichen Hotdog sein sollte. Die RPN befindet sich direkt in zwei Hälften bereit dazwischen nach der Berechnung erhalten. Jetzt kommt der schwierige Teil – Senf. Sie ist bereits auf der Wurst, t. E. Schon als unärer Operator berechnet. Es wird angenommen, dass Senf sollte auch als uncalculated und daher angezeigt werden soll rechts von der Wurst bewegt werden … Aber es ist möglich, dies würde erfordern, zu großen Stapeln von …