Newsgroup: it.comp.java
Titolo: ADT liste

ciao
dopo un'infarinatura di C, e dell'utilizzo dei puntatori e 
dell'allocazione dinamica della memoria, sono passato a Java.
Cercando in rete esempi di ADT in Java ho trovato pile e code, il tutto 
implementato con l'utilizzo dei vettori, quindi senza utilizzare 
linkedList etc.... forse per una questione puramente didattica.
Ora sei io volessi implementare come in c dinamicamente la gestione di 
una pila e delle dimesioni della struttura dati, a parte le classi gia 
pronte come linkedList e ArrayList, in Java quale altra strada potrei 
seguire?
Perchï¿œ se uso un vettore, posso solo lavorare su un numero di elementi 
finito.
grazie

 grazie
Premetto che non sono programmatore C, e che di ADT non avevo mai
sentito parlare (ma vista la definizione di Wikiperdia direi che il
concetto è implicito nei linguaggio OO).
1) Data la definizione di ADT, quello che ti dovrebbe importare è
l'interfaccia, e non l'implementazione!
2) In java non si parla praticamente mai di vettore, in quanto termine
ambiguo. Si potrebbe intendere o la classe Vector, che fa in pratica
quello che fa la ArrayList, ma lo fa peggio (non scendo nei dettagli,
cmq è deprecata e l'unica cosa che vale la pena sapere è che
esiste..), oppure di un array
3) LinkedList e ArrayList sono due implementazioni della stessa cosa,
ovvero la List. Dal punto di vista pratico si sceglie quasi sempre la
ArrayList (anche se in realtà sarebbe IMHO quasi sempre meglio usare
la linked...), comunque non ti dovrebbe spaventare che
l'implementazione usi arrays, in quanto l'implementazione prevede che
qualora la dimensione dell'array non basti, questo venga copiato in un
array più grande.
4) Vuoi implementarla a scopi didattici, o perchè ti serve una pila?
Se è perché ti serve la pila, allora è semplice, c'è la classe
apposta: java.util.Stack (he tra l'altro estende Vector!)
Se vuoi implementarla a scopi didattici, allora forse ti conviene
seguire l'approccio della java.util.LinkedList, ma dandole una
interfaccia Stack oriented (in pratica devi implementare
void push(Object)
e
Object pop()
5) Se usi java5 dai una occhiata a 
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Queue.html
,
ci sono diverse implementazioni differenti (basate sia su Array che su
Linked List)

 Se vuoi implementarla a scopi didattici
i sorgenti di java sono disponibili, credo che guardarli possa essere 
molto utile.
sv.

sv ha scritto:

ciao
� corretta la sintassi che ho scritto?
l'implementazione della Pila � incompleta mancano quasi tutti i metodi, 
ma volevo un parere,in pratica volevo incapsulare i metodi della 
LinekdList simulando che la classe sia da me implementata e accetti 
elementi di qualunque tipo.
public interface Pila <T>
{
    public void push(T el);
}
import java.util.*;
public class Cpila<T> implements Pila<T>
{
     private LinkedList<T> l;
     public Cpila()
     {
         l = new LinkedList<T>();
     }
     public void push(T el)
     {
       l.addFirst(el);
     }
     public void mostra()
     {
      Iterator<T> it = l.iterator();
      while(it.hasNext())
      {
       T x = it.next();
      }
     }
}
grazie

 grazie
trasformare il mostra() in toString() sarebbe utile.
sv.

sv ha scritto:

grazie!
p.s. come mai se provo a fare
Cpila c = new Cpila()
e poi a chiamare c.push(25) ottengo errore?

 sv.


Scommetto che ti da NullPointerException?
Il problema è che push invoca un metodo sull'oggetto l, che è
dichiarato ma mai instanziato (e quindi di default posto a null)
puoi risolvere il problema in 2 modi:
1) o lo instanzi durante l'istanziazione della classe, cambiando la
dichiarazione in
private LinkedList<T> l = new LinkedList();
o meglio, visto che l'argomento è l'AbstractDataType
private List<T> l = new LinkedList();
oppure lo istanzi nel costruttore.
2) se anzichè avere un 'semplice' LinkedList hai un oggetto 'pesante'
da costruire puoi adottare un approccio 'pigro' (lazy) in questo modo:
private List<T> l;
getL(){
  if(l == null)
     l = new LinkedList();
  return l;
}
in questo modo costruisci l'oggetto solo quando (e se) ne hai bisogno,
evitando di costruire ad es. oggetti che non serviranno mai

 dichiarato ma mai instanziato (e quindi di default posto a null) 
veramente lo istanzia gi� nel costruttore, quindi non pu� essere un 
NullPointerExcepion. Io ho solo un warning perch� non usa i generics.