Domanda

Sono stato a guardare la pagina wiki: http://en.wikipedia.org/ wiki / Manovra-yard_algorithm

Ho usato l'esempio di codice per costruire la prima parte, in pratica posso Attualmente girare:

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

Ma io non so come quindi utilizzare per 3 4 2 * 1 5 − 2 3 ^ ^ / + per ottenere 3.00012207

E il codice di esempio e la spiegazione sul wiki non stanno facendo alcun senso per me.

Qualcuno potrebbe spiegare come valutare 3 4 2 * 1 5 − 2 3 ^ ^ / + e produrre la risposta. Grazie in anticipo. Non ho bisogno di un esempio di codice solo una buona spiegazione o un guasto di un esempio.

Non che sia importante, ma sto lavorando .net C #.

È stato utile?

Soluzione

Lo scopo dell'algoritmo Scalo di smistamento è che la sua uscita è in Reverse Polish Notation , che è semplice da valutare:

  • creare una pila a valori di attesa
  • , mentre v'è entrata notazione polacca inversa rimasto:
    • leggere un elemento di ingresso
    • se è un valore, spingerlo in pila
    • in caso contrario, si tratta di un'operazione; pop valori dallo stack, eseguire l'operazione su quei valori, spingere la schiena risultato
  • quando non c'è ingresso destro, se l'espressione era ben formata, ci dovrebbe essere esattamente un valore sullo stack; questo è il risultato valutato.

Altri suggerimenti

La notazione post-fix è come si fa la matematica, per esempio, una calcolatrice HP.

Mantenere una pila, ogni volta che si ottiene un numero inserirlo verso l'alto. Ogni volta che si ottiene un operatore consumano ingressi dalla parte superiore e quindi aggiungere il risultato alla parte superiore

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
 ...    ...

Il processo gli elementi 3 4 2 * 1 5 − 2 3 ^ ^ / + da sinistra a destra come segue:

  1. Inizializza una pila di numeri di attesa.
  2. Se l'elemento è un numero, spingere in pila.
  3. se l'elemento è un operatore, rimuovere la parte superiore due elementi dalla pila, applicare l'operatore a questi due elementi, e spingere il risultato nello stack.

Quando si arriva alla fine, lo stack deve avere un unico elemento che sarà il risultato.

vedo io sono un po 'in ritardo alla festa.

ho visto la domanda e sono andato per la tangente a scrivere un paio di compiti per codice Rosetta. Si dà il caso che questo compito potrebbe essere quello che sono dopo. Esso fornisce una tabella annottated di ciò che accade nel calcolo del valore di un'espressione RPN, token token.

Ecco un esempio della sua produzione:

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'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top