Metodo pop che esplode...

di il
1 risposte

Metodo pop che esplode...

Salve raga sto implementando con le interfacce e il polimorfismo l'uso di uno stack ma il metodo pop sbomba... non so come risolvere, vi posto tutto il sorgente anche perché vorrei sapere se sto lavorando bene xd...

import java.util.ArrayList;


public class stack<S> implements stackinterface <S>  {

	@Override
	public void push(S date) {
		// TODO Auto-generated method stub
		
		stack.add(date);
		incrementaTop();
		
	}

	@Override
	public S pop() {
		// TODO Auto-generated method stub
		
		if(getTop()==0)
		return null;
		//else
	
		S a;
		
		a= stack.get(getTop());    // stack è di tipo arrayList
		decreTop();	 //funzione che fa' top--;
		return a;
	}
	
	stack()// il costruttore 
	{
		top=0;
		stack=new ArrayList<S>();
	}

	
	public  int getTop(){ 	return top;		}
	
	
	private  void incrementaTop(){ 	 top++;		}
	private  void decreTop(){ 	top--;	}
	
 private int top;
 ArrayList <S> stack;  // CREATO UN ARRAYLIST DI TIPO GENERICO(ci servirà per l'uso dello stack
 
 
}



e questa è l'interfaccia

public interface stackinterface<S> {

	
	public void push(S date);
	
	public 	S pop();
}
 

1 Risposte

  • Re: Metodo pop che esplode...

    broke31 ha scritto:


    salve raga sto implementando con le interfacce e il polimorfismo l'uso di uno stack ma il metodo pop sbomba... non so come risolvere, vi posto tutto il sorgente anche perché vorrei sapere se sto lavorando bene xd...
    La interfaccia è corretta (potresti omettere i public sui metodi ma non è un problema).
    La classe non è corretta. Il problema è che 'top' rappresenta allo stesso tempo sia il numero di elementi, sia l'indice del prossimo elemento. Se con lo stack iniziale fai 2 push, gli elementi sono agli indici 0 e 1 mentre top diventa 2. Ma quando fai un pop, il stack.get(getTop()) lancia IndexOutOfBoundsException perché l'indice 2 non esiste.

    Per fare uno stack con ArrayList non servirebbe nemmeno quel 'top'. Perché con i metodi di ArrayList puoi tranquillamente aggiungere al fondo e togliere dal fondo.

    Inoltre nella tua implementazione, anche se correggessi il concetto dell'indice, c'è un altro problema: nel pop non togli fisicamente l'elemento, decrementi solo il top ma questo non basta.

    E se invece di ArrayList usassi LinkedList, avresti anche metodi in più come removeLast() (che con ArrayList lo devi "comporre" tu basandoti sul size).
Devi accedere o registrarti per scrivere nel forum
1 risposte