Frage

Ich habe mir die Wiki -Seite angesehen: http://en.wikipedia.org/wiki/shunting-yard_algorithmus

Ich habe das Code -Beispiel verwendet, um den ersten Teil zu erstellen. Grundsätzlich kann ich derzeit drehen:

3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3 hinein 3 4 2 * 1 5 − 2 3 ^ ^ / +

Aber ich weiß nicht, wie ich dann benutzt werden soll 3 4 2 * 1 5 − 2 3 ^ ^ / + erhalten 3.00012207

Und der Beispielcode und der Beispiel für Wiki machen für mich keinen Sinn.

Könnte jemand bitte erklären, wie man bewertet 3 4 2 * 1 5 − 2 3 ^ ^ / + und produzieren Sie die Antwort. Danke im Voraus. Ich brauche kein Codebeispiel nur eine gute Erklärung oder eine Aufschlüsselung eines Beispiels.

Nicht, dass es wichtig ist, aber ich arbeite .net C#.

War es hilfreich?

Lösung

Der Zweck des Algorithmus des Ranging Yard ist, dass seine Ausgabe in der Ausgabe ist Polnische Notation umgekehrt, was unkompliziert zu bewerten ist:

  • Erstellen Sie einen Stapel, um Werte zu halten
  • Während es übrig polnische Notation Eingabe links gibt:
    • Lesen Sie ein Eingangsgegenstand
    • Wenn es sich um einen Wert handelt, schieben Sie ihn auf den Stapel
    • Ansonsten ist es eine Operation; POP -Werte aus dem Stapel, führen Sie den Vorgang für diese Werte aus, drücken Sie das Ergebnis zurück
  • Wenn keine Eingabe übrig ist, sollte es genau einen Wert auf dem Stapel geben, wenn der Ausdruck gut gebildet wurde. Dies ist das bewertete Ergebnis.

Andere Tipps

Die Notation nach dem Fix ist, wie Sie beispielsweise einen HP-Taschenrechner in den Vordergrund stellen.

Behalten Sie einen Stapel, wenn Sie eine Nummer erhalten, um sie nach oben zu geben. Wenn Sie einen Bediener erhalten

token stack
      *empty*
 3    3         //push numbers...
 4    3 4
 2    3 4 2
 *    3 8       //remove 4 and 2, add 4*2=8
 1    3 8 1
 5    3 8 1 5
 -    3 8 -4
 2    3 8 -4 2
 3    3 8 -4 2 3
 ^    3 8 -4 8
 ...    ...

Verarbeiten Sie die Elemente 3 4 2 * 1 5 − 2 3 ^ ^ / + Links nach rechts wie folgt:

  1. Initialisieren Sie einen Stapel, um Zahlen zu halten.
  2. Wenn das Element eine Zahl ist, schieben Sie es auf den Stapel.
  3. Wenn das Element ein Bediener ist, entfernen Sie die beiden oberen Elemente aus dem Stapel, wenden Sie den Bediener auf diese beiden Elemente an und schieben Sie das Ergebnis auf den Stapel.

Wenn Sie am Ende kommen, sollte der Stapel ein einzelnes Element haben, das das Ergebnis sein wird.

Ich sehe, ich bin etwas spät zur Party.

Ich sah die Frage und machte mich auf einen Tangenten, der ein paar Aufgaben für Rosetta Code schrieb. Es passiert einfach so diese Aufgabe Könnte sein, was Sie suchen. Es gibt eine annottierte Tabelle darüber, was passiert, wenn der Wert eines RPN -Ausdrucks von Token berechnet wird.

Hier ist eine Stichprobe seiner Ausgabe:

For RPN expression: '3 4 2 * 1 5 - 2 3 ^ ^ / +'

TOKEN           ACTION                 STACK      
3     Push num onto top of stack 3                
4     Push num onto top of stack 3 4              
2     Push num onto top of stack 3 4 2            
*     Apply op to top of stack   3 8              
1     Push num onto top of stack 3 8 1            
5     Push num onto top of stack 3 8 1 5          
-     Apply op to top of stack   3 8 -4           
2     Push num onto top of stack 3 8 -4 2         
3     Push num onto top of stack 3 8 -4 2 3       
^     Apply op to top of stack   3 8 -4 8         
^     Apply op to top of stack   3 8 65536        
/     Apply op to top of stack   3 0.0001220703125
+     Apply op to top of stack   3.0001220703125  

 The final output value is: '3.0001220703125'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top