2011-12-01 14 views
5

ho cercato la pagina wiki: http://en.wikipedia.org/wiki/Shunting-yard_algorithmdifficoltà a capire cosa fare con l'uscita di algoritmo di smistamento-cantiere

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 una spiegazione sul wiki ar non ha 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 una rottura di un esempio.

Non è importante, ma sto lavorando .net C#.

risposta

9

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

  • creare uno stack per contenere i valori
  • mentre c'è inverso ingresso notazione smalto rimasto:
    • leggere un elemento di ingresso
    • se è un valore, spingerlo nello stack
    • altrimenti, è un'operazione; popare i valori dallo stack, eseguire l'operazione su tali valori, spingere il risultato indietro
  • quando non è presente alcun input, se l'espressione è stata ben formata, ci dovrebbe essere esattamente un valore nello stack; questo è il risultato valutato.
+0

Uno stack è una struttura dati adeguata per raggiungere questo obiettivo, che tipo di raccolta suggeriresti ad utilizzare in Java (se lo si conosce)? A LinkedList o Deque? So che Java ha una classe Stack ma ho letto che non è utilizzabile a causa della sincronizzazione. – tonix

8

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

Mantieni uno stack, ogni volta che ottieni un numero, aggiungilo all'inizio. 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 
... ... 
2

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

  1. Inizializza una pila per contenere numeri.
  2. Se l'elemento è un numero, inserirlo nella pila.
  3. se l'elemento è un operatore, rimuovere i due elementi superiori dalla pila, applicare l'operatore a questi due elementi e spingere il risultato in pila.

Quando arrivi alla fine, la pila dovrebbe avere un singolo elemento che sarà il risultato.

2

Vedo che sono un po 'in ritardo per la festa.

Ho visto la domanda e sono andato su una tangente scrivendo un paio di compiti per Rosetta Code.Succede solo che this task potrebbe essere quello che stai cercando. Fornisce una tabella annotata di ciò che accade quando si calcola il valore di un'espressione RPN, token per 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' 
Problemi correlati