Pila bifronte

di il
25 risposte

Pila bifronte

Ciao a tutti
io devo implementare una classe che deve seguire le regole di uno stack (cioè last in first out) e deve poter aggiungere oggetti (nel mio caso interi ) sia da un lato della pila sia dall altra e quindi anche togliere .
Io ho implementato questa classe
public class PilaBifronte {
	
	private Node nodoSx;
	private Node nodoDx;
	private int contatore;
	
	 class Node{
		 int valore ;
		 Node next;
		
		
		public Node(int value){
			this.valore= value;
			next= null;
		}
		
	
	}
	public PilaBifronte(){
		nodoSx=nodoDx = null;
		contatore = 0;
	}
    //aggiunta di un valore a sx della pila
	public boolean eVuota(){
		if (nodoSx==null && nodoDx == null)
			return true;
		return false;
	}
	
	public void addSx(int v){
	Node nodo = new Node(v);
	
			nodo.next = nodoSx ;
			nodoSx = nodo;
		
		contatore ++;
	}
	
	// aggiunta a destra di un valore il metodo verifica anche se la pila è vuota
	public void addDx(int v){
		Node nodo = new Node(v);

		if(nodoSx == null){
			nodoSx = nodoDx = nodo;
			contatore ++;
			return;
		}
		
	    nodoDx.next= nodo.next;
		nodoDx = nodo;
		contatore ++;
		return;
		
	}
	
	public String toString(){
		String valori = "";
		while(nodoSx.next != null){
			valori += (nodoSx.valore+ " ");
		}
			return valori;
		}
	}
Compila bene ma quando vado ad eseguirla nella classe col main non mi da errore quando costruisco l oggeto PilaBifronte.
Vi posto anche il codice del main

public class ProvaPila {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PilaBifronte n = new PilaBifronte();
		
		n.addSx(3);
		n.addSx(5);
		n.addDx(9);
	    n.addSx(4);
	    n.addDx(0);
	    
	    System.out.println(n);
         if (!n.eVuota())
        	 System.out.println("ciao");
         
        
	}

}
Spero mi possiate aiutare
grazie in anticipo

25 Risposte

  • Re: Pila bifronte

    Tu pensi veramente che questa frase
    Compila bene ma quando vado ad eseguirla nella classe col main non mi da errore quando costruisco l oggeto PilaBifronte.
    sia chiara?
  • Re: Pila bifronte

    oregon ha scritto:


    Tu pensi veramente che questa frase
    Compila bene ma quando vado ad eseguirla nella classe col main non mi da errore quando costruisco l oggeto PilaBifronte.
    sia chiara?
    Si
    Ma cerco di esserlo di più
    quando eseguo javac da prompt dei comandi la classe PilaBifronte me la compila senza problemi ,invece mi da errore quando compilo la classe Prova pila e precisamente il seguente errore :

    ProvaPila.java:7: error: cannot find symbol
    PilaBifronte n = new PilaBifronte();
    ^
    symbol: class PilaBifronte
    location: class ProvaPila
    ProvaPila.java:7: error: cannot find symbol
    PilaBifronte n = new PilaBifronte();
    ^
    symbol: class PilaBifronte
    location: class ProvaPila
    2 errors

    Spero di essere stato più chiaro
  • Re: Pila bifronte

    stev809 ha scritto:


    quando eseguo javac da prompt dei comandi la classe PilaBifronte me la compila senza problemi ,invece mi da errore quando compilo la classe Prova pila e precisamente il seguente errore :

    ProvaPila.java:7: error: cannot find symbol
    PilaBifronte n = new PilaBifronte();
    ^
    Quando si compila "a mano" con i tools del JDK, si deve prestare molta attenzione al "classpath". Specialmente se ci fossero dei package di mezzo (nel tuo codice non vedo la dichiarazione di package, quindi presumo le classi siano nel package default -"unnamed"-)
  • Re: Pila bifronte

    No no sono nello stesso package ho solo omesso la dicitura e sono nella stessa cartella se può essere pù chiaro
  • Re: Pila bifronte

    stev809 ha scritto:


    No no sono nello stesso package ho solo omesso la dicitura e sono nella stessa cartella se può essere pù chiaro
    Allora devi dire quale è. E inoltre i nomi di package si devono sempre "riflettere" nella struttura delle cartelle.
  • Re: Pila bifronte

    Ok tagliamo la testa al toro e ti dico che anche su eclipse non va .... Il problema è nella struttura del codice
    ma non capisco quale sia
  • Re: Pila bifronte

    Qualcuno potrebbe dare un occhiata al codice qui sopra ???? magari c'è qualche errore che non vedo
    plzzzzzzzzzzzzz
  • Re: Pila bifronte

    stev809 ha scritto:


    magari c'è qualche errore che non vedo
    Ri-vedi bene gli addSx e addDx
  • Re: Pila bifronte

    Qui ho modificato un po il codice prima non mi stampava niente perchè il metodo toString non funzionava ora mi stampa addSx ma nn addDx cioè quando aggiungo valori da sinistra vengono aggiunti e stampati il che non avviene nel caso destro
    Cmq ecco il codice
    package it.java.uni;
    
    
    public class PilaBifronte {
    	
    	private Node nodoSx;
    	private Node nodoDx;
    	private int contatore;
    	
    	private class Node{
    		 int valore ;
    		 Node next;
    		 Node prev;
    		
    		public Node(int value){
    			this.valore= value;
    			prev=next= null;
    		}
    	}
    	
    	public PilaBifronte(){
    		nodoSx =nodoDx= null;
    		contatore = 0;
    	}
        //aggiunta di un valore a sx della pila
    	public boolean eVuota(){
    		if (nodoSx==null && nodoDx == null)
    			return true;
    		return false;
    	}
    	
    	public void addSx(int v){
    	Node nodo = new Node(v);
    	
    			nodo.next = nodoSx ;
    			nodoSx = nodo;
    		
    		contatore ++;
    	}
    	
    	// aggiunta a destra di un valore il metodo verifica anche se la pila è vuota
    	public void addDx(int v)throws NullPointerException{
    		Node nodo = new Node(v);
    
    		if(nodoSx == null&& nodoDx==null){
    			nodoSx = nodoDx = nodo;
    			contatore ++;
    			return;
    		}
    		
    	    nodo.next = nodoDx;
    	    nodo.prev = nodoDx.prev;
    	    nodoDx.prev = nodo;
    		nodoDx= nodo;
    		
    	
    		contatore ++;
    		return;
    		
    	}
    	
    	public String toString(){
    		String valori = "";
    		for (Node t = nodoSx;t!= null;t=t.next){
    			valori += (t.valore+" ");
    		}
    			return valori;
    		}
    	}
    
    
    non riesco a gestire l immissione da destra dei nodi come faccio ?
  • Re: Pila bifronte

    stev809 ha scritto:


    quando aggiungo valori da sinistra vengono aggiunti e stampati il che non avviene nel caso destro
    Innanzitutto vedo che hai aggiunto il "prev" ai nodi ... perché? Non serve. Cioè .. se ti è stato chiesto di implementare una lista "double linked", ok. Ma altrimenti non è strettamente necessario. O per dire meglio: il prev è utile se vuoi rimuovere velocemente un nodo dal fondo (la tua Dx). Se per rimuovere un nodo al fondo ti basta scansionare la lista dalla testa (tua Sx), allora prev NON serve.

    E comunque, ignorando il prev, se hai uno scenario come:
            +----------+        +----------+
    ??? --->| v | null |        | v | null |
            +----------+        +----------+
                 ^                   ^
                 |                   |
                 |                   |
               nodoDx              nuovo
    Togliendo ora il caso della lista vuota, quanti assegnamenti ti servono per fare in modo che "nuovo" sia il nuovo nodoDx?? Pensaci.

    E ripeto: RIvedi addSx/addDx. Per fare queste cose su liste di questo tipo serve solo "ragionare" (e per aiutarti ti basta fare degli schemini come quello sopra ).
  • Re: Pila bifronte

    Il prev l ho aggiunto apposta per non dover scansionare tutta la lista ...sia quando aggiungo un nodo che quando lo rimuovo (poi devo scrivere anche dei metodi per la rimozione ) .Pensavo che bastasse fare degli assegnamenti come in addSx
    
     nodo.next = nodoSx ;
     nodoSx = nodo;
    cioè:
    
    nodo.prev = nodoDx;
    nodoDx = nodo;
    
    Ma non fuoziona così mi manca qualcosa boh .
    Ti dico subito che il prev lo tengo per le suddette ragioni:
  • Re: Pila bifronte

    stev809 ha scritto:


    
    nodo.prev = nodoDx;
    nodoDx = nodo;
    
    Gestendo next E prev nei nodi, queste due righe sopra ti sembrano sufficienti per aggiungere un nodo a "destra"?? Pensaci.
  • Re: Pila bifronte

    In effetti non funziona ma nemmeno così :
    
    nodo.next = nodoDX;
    nodo.prev = nodoDx.prev;
    nodo.next = nodoDx.next;
    nodoDx = nodo 
    
    cosa manca ? o dove sbaglio ?
  • Re: Pila bifronte

    stev809 ha scritto:


    In effetti non funziona ma nemmeno così :
    
    nodo.next = nodoDX;
    
    cosa manca ? o dove sbaglio ?
    Scusa ma .... ragiona, se "nodo" dovrà essere l'ULTIMO nodo (successivo a quello a cui nodoDx punta appena prima del addDx), ha senso che il next del nodo nuovo punti "indietro" a nodoDx??
Devi accedere o registrarti per scrivere nel forum
25 risposte