|
|||||||
|
|
|
![]() |
|
|
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 13:56. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:10.



















