|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
[Java] Alberi Binari: Ridefinire Iteratore per visita Postfissa
Ciao a tutti.
Ho ridefinito l'Iterator di Java per poter iterare su un albero binario. Ho alcuni problemi a far muovere l'iteratore mediante visita postfissa. In particolare, sulle foglie ho implementato i seguenti metodi: Codice:
public class ICostante extends IEspressione implements Iterator<Espressione> { boolean flag=true; public ICostante(Costante c) { this.exp=c; //this.it=c.iterator(); } public boolean hasNext() { return this.flag; } public Espressione next() { if(flag){ this.flag=false; return exp; } throw new NoSuchElementException(); } } Codice:
public class IOperatorePostfisso extends IOperatore { private final int SINISTRA=0, DESTRA=1; private int puntatore=SINISTRA; public IOperatorePostfisso(Operatore o) { super(o); } public boolean hasNext(){ if(puntatore==DESTRA) return it.hasNext(); return true; } public Espressione next(){ if(it==null) this.it=exp.getLeft().iterator(); if(it.hasNext()) return it.next(); if(puntatore==SINISTRA){ puntatore=DESTRA; it=exp.getRight().iterator(); if(it.hasNext()) return it.next(); else return exp; //nodo non terminale operatore } throw new NoSuchElementException(); } ![]() ![]() Per esempio se inserisco la seguente espressione: 4+5*3 L'iteratore mi stampa: 4 5 3 Perché non mi ritorna mai exp quando è un operatore? ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
Allora, ho capito l'errore che sta nel metodo hasNext()
Che in caso di Puntatore a destra non deve ritornare l'hasNext() del figlio ma una propria flag che segnala se l'operatore stesso è stato già ritornato. Questo perché nella visita postfissa l'ultimo ad essere ritornato è il nodo padre e non il figlio destro. A parole non mi spiego molto bene meglio incollare il codice corretto. Codice:
public class IOperatorePostfisso extends IOperatore { private final int SINISTRA=0, DESTRA=1; private int puntatore=SINISTRA; private boolean flag=false; public IOperatorePostfisso(Operatore o) { super(o); } public boolean hasNext(){ if(puntatore==DESTRA) return !flag; return true; } public Espressione next(){ if(it==null) this.it=exp.getLeft().iterator(); if(it.hasNext()) return it.next(); if(puntatore==SINISTRA){ puntatore=DESTRA; it=exp.getRight().iterator(); if(it.hasNext()) return it.next(); } if(puntatore==DESTRA){ flag=true; return exp; } throw new NoSuchElementException(); }
__________________
![]() Ultima modifica di luxorl : 18-08-2008 alle 12:56. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:48.