|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 453
|
[c/c++] lettura albero di espressioni aritmetiche
|
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Ciao,
devi attraversare ricorsivamente l'albero chiedendo ad ogni nodo di valutare se stesso. Un nodo valuta se stesso restituendo il proprio valore se si tratta di un operando; se si tratta invece di un operatore, restituisce il valore dell'applicazione dell'operatore ai propri figli. Questo è un esempio: Codice:
double EvalTree(Tree *pTree) { double dblLeft; double dblRight; if ( !pTree ) return 0.0; switch ( pTree->tok->Type ) { case VALUE: return pTree->tok->Value; case PLUS: return EvalTree(pTree->left) + EvalTree(pTree->right); case MINUS: return EvalTree(pTree->left) - EvalTree(pTree->right); case MULT: return EvalTree(pTree->left) * EvalTree(pTree->right); case DIV: dblLeft = EvalTree(pTree->left); dblRight = EvalTree(pTree->right); if ( dblRight == 0 ) { printf("Errore: divisione per zero!\n"); return 0.0; } else { return dblLeft / dblRight; } case EXP: return pow(EvalTree(pTree->left), EvalTree(pTree->right)); case UPLUS: return EvalTree(pTree->right); case UMINUS: return -1 * EvalTree(pTree->right); default: if ( pTree->tok->Type == OPAREN ) printf("Errore: parentesi non bilanciate.\n"); else printf("Operatore non riconosciuto: %c\n", pTree->tok->str); //printf("Operatore non riconosciuto: %s", pTree->tok->str); return 0.0; } } ![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Riassumendo: visita simmetrica
__________________
In God we trust; all others bring data Ultima modifica di sottovento : 13-10-2008 alle 15:45. Motivo: Errore: avevo scritto preordine invece di simmetrica |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 453
|
mi puoi fare un esempio di visita in pre ordine?? grazie
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quella che ha fatto Vincenzo1968 e' una visita simmetrica.
Cmq, questa e' la mia versione (praticamente uguale a quella di Vincenzo): Codice:
double EvalTree(Tree *pTree) { if (pTree) { if (!pTree->left && !pTree->right) return toDouble(pTree->token); double leftVal = EvalTree(pTree->left); double rightVal = EvalTree(pTree->right); double val = executeOperation (pTree->token, leftVal, rightVal); } return 0.0; }
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:20.