Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    Problema implementazione stack stramite coda

    Dovrei implementare un' interfaccia Stack tramite coda.
    Il problema č nella pop() e push() che non sto capendo come gestire.
    In uno stack la pop e la push vengono fatte sempre in top, mentre nella coda l'estrazione avviene in testa(front) e l'inserimento in rear(coda).
    Quindi come posso farla funzionare visto che prevede queste cose fatte in modo diverso?

    La classe l'ho scritta cosě:

    codice:
    public class Queue<E> implements Stack<E>
    {
    	private int errori=0;
    	
    	private int size;
    	
    	private Node <E> top;
    	
    	private Node<E> front;
    	
    	private Node<E> rear;
    	
    	public Queue()
    	{
    		
    		rear=top=null;
    		front=rear;
    		size=0;
    	}
    	
    	public boolean isEmpty(){return(top==null);}
    	
    	public int getSize(){return size;}
    	
    	public E top() throws EmptyStackException
    	{
    		
    		if(isEmpty()) throw new EmptyStackException(errori+" errori generati");
    		return rear.getElement();
    		
    	}
    	
    	public E pop() throws EmptyStackException
    	{
    		if(isEmpty()) throw new EmptyStackException(errori+" errori generati");
    		E object=front.getElement();
    		rear=rear.getNext();
    		size--;
    		front=null;
    		front=rear;
    		return object;
    	}
    	
    	public void push(E element)
    	{
    		Node <E> node=new Node<E>(element, rear);
    		rear=node;
    		front=rear;
    		size++;
    	}
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problema implementazione stack stramite coda

    Originariamente inviato da Darčios89
    Dovrei implementare un' interfaccia Stack tramite coda.
    Se una queue fa proprio solo da "coda" nel senso: entra da una parte, esce dall'altra parte (e basta) mi pare abbastanza intuitivo che non puoi e non avrebbe senso usarla per uno stack.

    Ma potresti anche avere una collezione che fa sia da queue, sia da stack.
    Prendi per esempio java.util.LinkedList che č standard del framework. Puň funzionare sia da stack che da queue perché ha tutti i metodi per inserire ed estrarre sia in head che in tail.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Siccome sono abbastanza confuso, tu cosa pensi si debba usare?
    L'esercizio dice:

    codice:
    Si realizzi un'implementazione dell'interfaccia Stack<E> (come vista a lezione)
    utilizzando esclusivamente istanze della classe Queue<E>.
    In seguito si realizzi un programma Java che, utilizzando la nuova classe creata,
    prenda in input una sequenza di operazioni di push e pop e restituisca in output la
    configurazione finale dello stack cosě ottenuto.
    Input
    Il file di input contiene una sequenza di operazioni push e pop, una per riga,
    terminanti con il simbolo “ ;” (punto e virgola). Le operazioni di push prendono
    come input un numero intero compreso tra 0 e 99.
    Output
    il file di output contiene due righe. La prima riga indica il numero di
    EmptyStackException generate durante l'esecuzione. La seconda riga contiene la
    configurazione finale dello stack, dall'elemento in testa fino all'elemento in fondo
    allo stack.
    L'interfaccia stak č banale, con top e i metodi push(), pop()..eccetera.
    Ma lě dice con una coda, quindi come faccio se la coda funziona in quel modo?
    Non capisco come puň funzionare sia da stack che da queue...
    Non posso usare classi precostruite da Java, devo fare tutto da solo purtroppo.

  4. #4
    Un aiutino??
    Per piacere.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Stavo ragionando su questa frase.
    codice:
    Si realizzi un'implementazione dell'interfaccia Stack<E> (come vista a lezione)
    utilizzando esclusivamente istanze della classe Queue<E>.
    Ma non mi torna affatto .... che senso ha??

    L'unica cosa che mi verrebbe in mente di fare che č tecnicamente fattibile č questa: se hai una queue con 5 elementi e vuoi prendere l'ultimo elemento inserito, dalla queue teoricamente/logicamente non potresti. Perché una coda non fa uscire l'ultimo inserito ma il primo. Cosa si potrebbe pensare di fare? Beh, in modo molto contorto estrai i primi 4 elementi e li metti in un'altra nuova queue. Il quinto (l'ultimo insomma) lo estrai e te lo tieni.

    Ma scusate se lo dico, mi pare abbastanza cervellotico ... della serie "come usare un cacciavite per piantare un chiodo".

    Originariamente inviato da Darčios89
    Non posso usare classi precostruite da Java, devo fare tutto da solo purtroppo.
    Sě sě ok. Prima parlavo di LinkedList ma solo a titolo di esempio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Ah interessante.......bč..oggi proverň...e ti farň sapere...
    Si questi esercizi sono davvero strani, cioč io mi ci metto a farli, capisco che siano fatti per esercitarsi...ma entro i limiti del normale
    Non capisco perchč fare cose cosě contorte.
    A dopo.

  7. #7
    Allora vorrei basarmi sulla tua idea.....piů o meno dovrebbe essere cosě:

    http://www.allfreeportal.com/imghost...324615Idea.JPG


    La push non dovrebbe darmi problemi perchč la faccio sempre in un senso, la pop invece nell'altro senso che non mi serve.
    Allora il fatto č che usando la coda di appoggio dovrei reinserire gli elementi di quest'ultima in quella di partenza su cui sto invocando il metodo, ed č questa cosa che non riesco a fare.
    Altrimenti....dato che all'interno del metodo pop creo un'altra coda di appoggio...c'č un modo per fare capire al mio metodo che voglio fare...come una sorta di assegnamento?
    Cioč dato che la coda di partenza diventerŕ come quella di appoggio posso in qualche modo asegnare alla coda su cui sto invocando il metodo, la coda diappoggio?
    la parte di codice senza reinserire gli elementi, l'ho fatta cosě, quella per inserire in una coda di supporto gli elementi.

    codice:
    public E pop() throws EmptyStackException
    	{
    		if(isEmpty()) throw new EmptyStackException(errori+" errori generati");
    		
    		Queue<E> appoggio=new Queue<E>();
    		while(front.getNext()!=null)
    		{
    			appoggio.push(front.getElement());
                                          front=front.getNext();
    
    		}
    		
    			rear=null;
    Per il resto...che possibilitŕ ho?

    P.S. stavo pensando, forse mi conviene implementare normalmente la queue e la dequeue e poi nel main fare il lavoro sulla coda di supporto?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Darčios89
    il fatto č che usando la coda di appoggio dovrei reinserire gli elementi di quest'ultima in quella di partenza su cui sto invocando il metodo
    No. La coda che tu chiami di "appoggio" la fai diventare "la coda" del tuo stack, facendo "perdere" il riferimento a quella vecchia semplicemente assegnando al campo di istanza la nuova coda.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Ma nel metodo stesso pop?
    Cioč nel main posso fare questa cosa o creo all'interno del metodo una nuova coda?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Darčios89
    Ma nel metodo stesso pop?
    Cioč nel main posso fare questa cosa o creo all'interno del metodo una nuova coda?
    Molto abbozzato
    codice:
    public class StackConCoda<E> implements Stack<E> {
        private Queue<E> coda;
        
        ...
        
        public E pop() throws EmptyStackException {
            ...
            Queue<E> appoggio = .....
            
            .....
            
            coda = appoggio;
            
            return ....
        }
        ....
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.