Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: Esercizio sugli stack

  1. #1

    Esercizio sugli stack

    C'č un esercizio in pņ complesso, che mi sta dando qualche problema, volevo chiedere se avete del tempo l'aiuto per la risoluzione di alcuni errori...

    codice:
    Si fornisca un'efficiente implementazione dell'interfaccia
    StackSet140910<E>, come mostrata nella pagina successiva.
    La classe rappresenta un insieme ordinato i cui elementi sono
    semplici stack (classe MStack<E>).
    Ogni stack dell'insieme č rappresentato dal suo elemento che
    si trova in cima allo stack. Ogni stack potrą contenere al
    massimo 50 elementi.
    L'insieme dovrą essere rappresentato attraverso una lista
    concatenata e gli stack dell'insieme dovranno essere ordinati
    in base al loro elemento rappresentante. Uno stack che non
    contiene alcun elemento dovrą apparire nella lista prima di
    qualsiasi altro stack (considerarlo come l'elemento pił
    piccolo dell'insieme)
    La gestione delle eccezioni all'interno delle classi č
    facoltativa.
    Realizzare in seguito, mediante il metodo main() della
    classe, un programma Java che prenda in input un file di
    testo contenente una sequenza di numeri interi e restituisca
    in output un file di testo contenente le specifiche della
    struttura ottenuta dopo l'inserimento di tali numeri a
    partire da uno StackSet140910 contenente 3 stack vuoti.
    Il programma consegnato dovrą compilare correttamente e dovrą
    produrre il corretto output. In caso contrario la soluzione
    verrą considerata errata.
    Specifiche della classe
    Qualsiasi struttura dati ausiliaria dovrą essere
    implementata dallo studente.Il file di input contiene una sequenza di numeri interi, uno
    per riga.
    Il file di output dovrą contenere la lista degli elementi
    contenuti nei tre stack dell'insieme (uno stack per riga),
    iniziando dagli elementi che si trovano in cima alla
    struttura.
    Ecco l'interfaccia:

    codice:
    import java.util.*;
    public interface StackSet140910<E> extends Iterable<E>{
    public int stacks ();
    // ritorna il numero di stack (di tipo MStack<E>) dell'insieme
    public int items ();
    // ritorna il numero di elementi (E) dell'insieme
    public MStack<E> getMin ();
    // ritorna il primo stack vuoto dell'insieme.
    // Se non esistono stack vuoti nell'insieme ritorna
    // lo stack con il pił piccolo valore in testa
    public E pop ();
    // effettua il pop sul primo stack dell'insieme
    public void push (E elem);
    // effettua il push di un elemento sul primo stack dell'insieme
    public void addStack ();
    // aggiunge un nuovo stack vuoto all'insieme
    public Iterator<E> iterator();
    // ritorna un iteratore di tutti gli elementi (di tipo E)
    // contenuti negli stack dell'insieme
    }
    Quindi mi sembra di aver capito che io ho un insieme, una linkedlist, che č una collezione di stack, allora ho pensato di creare la classe nodo, MStack, dove MStack č implementato sempre tramite LinkedList, e poi di realizzare l'insieme che contiene gli MStack sempre in una linkedList dove per ogni nodo abbiamo un MStack.
    Ho dei problemi rigurado alcuni metodi....posto il codice e alcuni degli errori:

    Vi posto gli errori, che si verificano dove ho commentato nel codice //errore

    codice:
    SS7_003292.java:149: cannot find symbol
    symbol  : method getSize()
    location: interface java.lang.Comparable<E>
    		items+=testa.getElement().getSize();  //primo errore, non trova il metodo getSize()
    		                         ^
    SS7_003292.java:149: inconvertible types
    found   : <nulltype>
    required: int
    		items+=testa.getElement().getSize();  //primo errore, non trova il metodo getSize()
    		                                 ^
    SS7_003292.java:159: cannot find symbol
    symbol  : method top()
    location: interface java.lang.Comparable<E>
    		E min=stackset.getHead().getElement().top();         //errore, non trova il metodo top()
    		                                     ^
    SS7_003292.java:163: cannot find symbol
    symbol  : method getSize()
    location: interface java.lang.Comparable<E>
    			if(testa.getElement().getSize()==0)
    			                     ^
    Non capisco perchč...perchč cerca i metodi nell'interfaccia comparable? viene estesa dalla mia classe ma perchč non li cerca al posto giusto?

    codice:
    import java.util.*;
    import java.io.*;
    
    interface StackSet140910<E>/* extends Iterable<E>*/{
    public int stacks ();
    // ritorna il numero di stack (di tipo MStack<E>) dell'insieme
    public int items ();
    // ritorna il numero di elementi (E) dell'insieme
    public MStack<E> getMin ();
    // ritorna il primo stack vuoto dell'insieme.
    // Se non esistono stack vuoti nell'insieme ritorna
    // lo stack con il pił piccolo valore in testa
    public E pop ();
    // effettua il pop sul primo stack dell'insieme
    public void push (E elem);
    // effettua il push di un elemento sul primo stack dell'insieme
    public void addStack ();
    // aggiunge un nuovo stack vuoto all'insieme
    //public Iterator<E> iterator();
    // ritorna un iteratore di tutti gli elementi (di tipo E)
    // contenuti negli stack dell'insieme
    }
    
    class Node<E>
    {
    	private E element;
    	private Node<E> next;
    	
    	public Node(E element, Node<E> next)
    	{
    		this.element=element;
    		this.next=next;
    	}
    	
    	public E getElement(){return element;}
    	
    	public void setElement(E element){this.element=element;}
    	
    	public Node<E> getNext(){return next;}
    	
    	public void setNext(Node<E> next){this.next=next;}
    }
    
    class LinkedList<E>
    {
    	private Node<E> head, tail;
    	private int size;
    	
    	public LinkedList()
    	{
    		size=0;
    		head=tail=null;
    	}
    	
    	public Node<E> getHead(){return head;}
    	
    	public Node<E> getTail(){return tail;}
    	
    	public int getSize(){return size;}
    	
    	public void addNodeTail(Node<E> node) //inserimento in coda
    	{
    		if(size==0)
    			tail=node;
    		
    		else
    		{
    			tail.setNext(node);
    			tail=node;
    		}
    	    size++;
    	}
    	
    	public void AddNodeHead(Node<E> node) //inserimento in testa
    	{
    		if(size==0)
    			head=node;
    		else
    		{
    			node.setNext(head);
    			head=node;
    		}
    		size++;
    	}
    	
    	public void removeHead()    //rimozione in testa
    	{
    		Node<E> tmp=head;
    		head=head.getNext();
    		head=null;
    		size--;
    	}
    			
    }
    
    class MStack<E>
    {
    	private LinkedList<E> stack;           //lo implemento con linkedlist
    	private int size;
    	
    	public MStack()
    	{
    		size=0;
    		stack=new LinkedList();
    	}
    	
    	public int getSize(){return size;}
    	
    	public void push(E element)
    	{
    		Node<E> node=new Node(element,null);
    		stack.AddNodeHead(node);
    		size++;
    	}
    	
    	public void pop()
    	{
    		stack.removeHead();
    		size--;
    	}
    	
    	public Node<E> top()
    	{
    		Node<E> tmp=stack.getHead();
    		return tmp;
    	}
    }
    
    class InsiemeStackSet140910<E extends Comparable<E>> implements StackSet140910<E>
    {
    	LinkedList<E> stackset;
    	private int size;
    	
    	public InsiemeStackSet140910()
    	{
    		size=0;
    		stackset=new LinkedList();
    	}
    	
    	public int stacks(){return size;}
    	
    	public int items ()
    	{
    		int items=0;
    		
    		Node<E> testa;
    		
    		for(testa=stackset.getHead(); testa!=null; testa=testa.getNext())
    		items+=testa.getElement().getSize();  //primo errore, non trova il metodo getSize(), non capisco perchč, con l'istruzione prima dovrebbe accedere all'MStack, perchč non trova il metodo e lo cerca da un'altra parte?
    		
    		return items;
    	}
    	
    	public MStack<E> getMin ()
    	{
    		Node<E> testa;
    		
    		MStack<E> tmp;
    		E min=stackset.getHead().getElement().top();         //errore, non trova il metodo top()
    		
    		for(testa=stackset.getHead(); testa!=null; testa=testa.getNext())
    		{
    			if(testa.getElement().getSize()==0)         //anche qui non trva getSize()
    			{
    				tmp=testa.getElement();
    				return tmp;
    			}
    			
    			else if(min.compareTo(testa.getElement().top())>0)
    				min=testa.getElement().top();
    		}
    		
    	    return min;
    	}
    	
    	public E pop ()
    	{	size--;
    		E tmp=stackset.removeHead();
    		return tmp;
    	}
    	
    	public void push(E element)
    	{
    		stackset.getHead().getElement().addNodeHead(Node<E> node);
    		size++;
    	}
    	
    	public void addStack ()
    	{
    		MStack<E> nuovostack=new MStack();
    		Node<E> node=new Node(nuovostack,stackset.getHead());
    		stackset.addNodeHead(node);
    	}
    	
    	//public Iterator<E> iterator();
    // ritorna un iteratore di tutti gli elementi (di tipo E)
    // contenuti negli stack dell'insieme
    	
    }
    
    /*class ElementsIterator<E> implements Iterator<E>
    {
    	private LinkedList<E> listIterator;
    	private LinkedList<E> support;
    	private Node<E> cursor;
    	
    	public ElementsIterator()
    	{
    		listIterator=new LinkedList();
    	}
    	
    	support=new LinkedList();
    	Node<E> tmp;
    	
    	for(tmp=listIterator.getHead(); tmp!=null; tmp=tmp.getNext())
    	support.addNodeHead(tmp);
    	
    	if(support.getHead()==null)
    		cursor=null;
    	else cursor=support.getHead();
    	
    	public boolean hasNext()
    	{
    		
    	*/

  2. #2
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    ti rispondo sul primo errore

    devi fare il cast esplicito se vuoi usare metodi dei generici

    items+=((LinkedList)testa.getElement()).getSize();

  3. #3
    AH bene, provvedo subito a correggere, per il resto, come ti sembra il codice?
    A parte gli errori di sintassi, credi che sia pensata bene l'implementazione?

  4. #4
    Allora...ora ci sono problemi ben pił gravi, cioč che il codice compila, ma non funziona, ci sono dei problemi con un iteratore che ho implementato, non funziona, non capisco se sia un problema di tipizzazione, forse sbaglio ad usare i tipi, ma non č che riesca a venirne a capo....

    Il codice č questo:

    codice:
    import java.util.*;
    import java.io.*;
    
    interface StackSet140910<E> extends Iterable<E>{
    public int stacks ();
    // ritorna il numero di stack (di tipo MStack<E>) dell'insieme
    public int items ();
    // ritorna il numero di elementi (E) dell'insieme
    public MStack<E> getMin ();
    // ritorna il primo stack vuoto dell'insieme.
    // Se non esistono stack vuoti nell'insieme ritorna
    // lo stack con il pił piccolo valore in testa
    public E pop ();
    // effettua il pop sul primo stack dell'insieme
    public void push (E elem);
    // effettua il push di un elemento sul primo stack dell'insieme
    public void addStack ();
    // aggiunge un nuovo stack vuoto all'insieme
    public Iterator<E> iterator();
    // ritorna un iteratore di tutti gli elementi (di tipo E)
    // contenuti negli stack dell'insieme
    }
    
    class Node<E>
    {
    	private E element;
    	private Node<E> next;
    	
    	public Node(E element, Node<E> next)
    	{
    		this.element=element;
    		this.next=next;
    	}
    	
    	public E getElement(){return element;}
    	
    	public void setElement(E element){this.element=element;}
    	
    	public Node<E> getNext(){return next;}
    	
    	public void setNext(Node<E> next){this.next=next;}
    }
    
    class LinkedList<E> 
    {
    	private Node<E> head, tail;
    	private int size;
    	
    	public LinkedList()
    	{
    		size=0;
    		head=tail=null;
    	}
    	
    	public Node<E> getHead(){return head;}
    	
    	public Node<E> getTail(){return tail;}
    	
    	public int getSize(){return size;}
    	
    	public void addNodeTail(Node<E> node) //inserimento in coda
    	{
    		if(size==0)
    			tail=node;
    		
    		else
    		{
    			tail.setNext(node);
    			tail=node;
    		}
    	    size++;
    	}
    	
    	public void AddNodeHead(Node<E> node) //inserimento in testa
    	{
    		if(size==0)
    			head=node;
    		else
    		{
    			node.setNext(head);
    			head=node;
    		}
    		size++;
    	}
    	
    	public Node<E> removeHead()    //rimozione in testa
    	{
    		Node<E> tmp=head;
    		head=head.getNext();
    		tmp.setNext(null);
    		size--;
    		return tmp;
    	}
    			
    }
    
    class MStack<E>
    {
    	private LinkedList<E> stack;           //lo implemento con linkedlist
    	private int size;
    	
    	public MStack()
    	{
    		size=0;
    		stack=new LinkedList();
    	}
    	
    	public int getSize(){return size;}
    	
    	public void push(E element)
    	{
    		if(size<50)
    		{
    			Node<E> node=new Node(element,null);
    			stack.AddNodeHead(node);
    			size++;
    		}
    	}
    	
    	public void pop()
    	{
    		stack.removeHead();
    		size--;
    	}
    	
    	public E top()
    	{
    		Node<E> tmp=stack.getHead();
    		return tmp.getElement();
    	}
    }
    
    class InsiemeStackSet140910<E extends Comparable<E>> implements StackSet140910<E>
    {
    	LinkedList<E> stackset;
    	private int size;
    	
    	public InsiemeStackSet140910()
    	{
    		size=0;
    		stackset=new LinkedList();
    	}
    	
    	public int stacks(){return size;}
    	
    	public int items ()
    	{
    		int items=0;
    		
    		Node<E> testa;
    		
    		for(testa=stackset.getHead(); testa!=null; testa=testa.getNext())
    		items+=((MStack<E>)testa.getElement()).getSize();  
    		
    		return items;
    	}
    	
    	public MStack<E> getMin ()
    	{
    		Node<E> testa;
    		
    		MStack<E> tmp=null;
    		Node<E> min=stackset.getHead();
    		
    		E minimo=(E)((MStack)min.getElement()).top();      
    		
    		for(testa=stackset.getHead(); testa!=null; testa=testa.getNext())
    		{
    			if(((MStack)testa.getElement()).getSize()==0)         //anche qui non trva getSize()
    			{
    				tmp=(MStack<E>)testa.getElement();
    				return tmp;
    			}
    			
    			else if(minimo.compareTo((E)((MStack)testa.getElement()).top())>0)
    			{
    				minimo=(E)((MStack)testa.getElement()).top();
    				tmp=(MStack<E>)testa.getElement();
    			}
    		}
    		
    	    return tmp;
    	}
    	
    	public E top()
    	{
    		return (E)stackset.getHead();         //anche qui errore
    	}
    	
    	public E pop ()
    	{	size--;
    		E tmp=(E)stackset.removeHead();
    		return tmp;
    	}
    	
    
    	public void push(E element)
    	{
    		Node<E> node=new Node(element,null);
    		((MStack)stackset.getHead().getElement()).push(node);
    		size++;
    	}
    	
    	public void addStack()
    	{
    		MStack<E> nuovostack=new MStack();
    		Node<E> node=new Node(nuovostack,null);
    		stackset.AddNodeHead(node);
    	}
    	
    public Iterator<E> iterator(){
    return new ElementsIterator(this);}      //anche qui
    	
    	
    	public String toString()
    	{
    		String s="";
    		Iterator<E> it=this.iterator();      //la chiamata dell'errore sale qui
    		
    		while(it.hasNext())
    			s+=it.next();
    		
    	return s;
    	}
    }
    
    class ElementsIterator<E> implements Iterator<E>
    {
    	private InsiemeStackSet140910 insiemeIterabile;
    	private MStack<E> Internalcursor;
    	private Node<E> Externalcursor;
    	
    	public ElementsIterator(InsiemeStackSet140910 insiemeIterabile)
    	{
    		this.insiemeIterabile=insiemeIterabile;
    		Internalcursor=((MStack<E>)((Node<E>)insiemeIterabile.top()).getElement());    //Anche qui c'č errore
    		Externalcursor=(Node<E>)insiemeIterabile.top();
    	}
    	
    
    	public boolean hasNext()
    	{
    		if(Internalcursor.getSize()!=0)
    			return true;
    		
    		else if(Externalcursor.getNext()!=null)
    			return true;
    		
    		return false;
    		
    	}
    	
    	public E next()
    	{
    		E tmp=Internalcursor.top();
    		Internalcursor.pop();
    		if(Internalcursor.getSize()==0 &&Externalcursor.getNext()!=null)
    		{
    			Externalcursor=Externalcursor.getNext();
    			Internalcursor=(MStack<E>)Externalcursor.getElement();
    		}
    		
    		else{
    			Externalcursor=null;
    			Internalcursor=null;
    		}
    		
    	return tmp;
    	}
    	
    	public void remove(){}
    }
    			
    
    
    public class SS7_003292
    {
    	public void Inserisci(String input, String output)
    	{
    		FileReader reader=null;
    		BufferedReader buff=null;
    		PrintWriter out=null;
    		
    		try{
    			reader=new FileReader("input.txt");
    			buff=new BufferedReader(reader);
    			out=new PrintWriter("output.txt");
    			
    			InsiemeStackSet140910 insiemeStack=new InsiemeStackSet140910();
    			
    			insiemeStack.addStack();
    			
    			while(buff.ready())
    			{
    				String elemento=buff.readLine();
    				insiemeStack.push(elemento);
    			}
    		
    		
    		   out.print(insiemeStack.toString());     //poi arriviamo qui
    		}
    	
    		
    		catch(FileNotFoundException e1)
    		{
    			System.out.println("input.txt not found");
    		}
    		
    		catch(IOException e2)
    		{
    			System.out.println("Input/Output error");
    		}
    		
    		try{
    			buff.close();
    			out.close();
    		}
    		
    		catch(IOException e2)
    		{
    			System.out.println("Error...it is not possible to close files");
    		}
    	}
    	
    public static void main(String [] args)
    {
    	SS7_003292 main=new SS7_003292();
    	long start=System.currentTimeMillis();
    	main.Inserisci("input.txt", "output.txt");  //tutto parte da qui
    	long end=System.currentTimeMillis();
    	System.out.println("Il tempo d'esecuzione č "+(end-start)+" ns");
    }
    
    }
    E mi stampa questi errori (Nel codice ho segnato i punti corrispondenti agli errori):

    codice:
    Exception in thread "main" java.lang.ClassCastException: Node cannot be cast to java.lang.Comparable
    	at InsiemeStackSet140910.top(SS7_003292.java:187)
    	at ElementsIterator.<init>(SS7_003292.java:236)
    	at InsiemeStackSet140910.iterator(SS7_003292.java:212)
    	at InsiemeStackSet140910.toString(SS7_003292.java:218)
    	at SS7_003292.Inserisci(SS7_003292.java:300)
    	at SS7_003292.main(SS7_003292.java:329)
    Mi sapreste aiutare?
    Ve ne sarei davvero davvero grato...č una giornata che mi fa impazzire.

  5. #5
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Nel caso, potrebbe esserti utile dare un'occhiata a questa discussione...

    http://forum.html.it/forum/showthrea...readid=1423570

  6. #6
    Sono riuscito....grazie mille

  7. #7
    Mi są che siamo colleghi d'universitą...stessi esercizi e lottiamo con la stessa materia :-(

  8. #8
    codice:
    if(Sicula83.getFacoltą().equals(Informatica) && Sicula83.getAteneo().equals(Catania))
    return true;


    Mi sa di si, sto uscendo pazzo....non penso di riuscire a passare l'esame, ho un paio di dubbi sulle visite e sulle implementazioni, perņ mi presento, non l'ho mai fatto l'esame perchč ho fatto altre materie e non sono arrivato a prepararmi, perņ ci provo.
    Non riesco a capire il BFS, come funziona e l'ordine in cui vengono visitati i nodi...

  9. #9
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    BFS (visita in ampiezza)

    http://it.wikipedia.org/wiki/Breadth-first_search

    In pochissime parole: hai una coda che, all'inizio, contiene il solo nodo radice. L'algoritmo č il seguente.
    Finchč la coda contiene elementi:
    - visita il nodo in prima posizione nella coda
    - aggiungi in ordine in fondo alla coda tutti i nodi figli del primo nodo
    - rimuovi dalla coda il nodo in prima posizione

  10. #10
    Grazie, spero che negli esercizi riesca ad usarlo, molto chiaro.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.