2. Cos'è uno stack?
Una struttura dati (astratta) di tipo LIFO (Last In
First Out)
Ovvero, I dati sono estratti in modo inverso
rispetto all'ordine di inserimento
Quindi esattamente come una pila di libri, o di altri
oggetti
Novembre 2013
2
3. Struttura
Lo stack è una struttura estremamente semplice
Dotato di poche operazioni: inserimento di un
oggetto nello stack ed estrazione di un oggetto
dallo stack
Opzionalmente si possono inserire altre
funzionalità di supporto, per esempio per
controllare se lo stack è vuoto oppure no.
Novembre 2013
3
4. Struttura
Le operazioni di inserimento ed estrazione sono
chiamate classicamente “push” e “pop”.
Lo stack è una struttura informatica
FONDAMENTALE. E' usato infatti per
(livello macchina): chiamate a funzioni
Ricorsione
Risoluzione di espressioni
...
Novembre 2013
4
6. Possibile scheletro di implementazione
abstract public class Stack {
abstract public Object pop();
abstract public void push(Object
obj);
abstract public boolean isEmpty() ;
}
Novembre 2013
6
7. Classe... astratta?
Una classe astratta è una classe che non si
implementa direttamente, ma nella quale si
dichiarano tutti i metodi che si vogliono
implementare nella classe “vera”
E' una classe che non si può utilizzare
direttamente, ma deve essere implementata
tramite sottoclassi.
Ricorda un po' le dichiarazioni delle funzioni in
C/C++ (ma non troppo)
Novembre 2013
7
9. Implementazione statica
In questo caso, occorre allocare in anticipo lo
spazio da utilizzare (tipicamente un array,
stimandone la dimensione)
Una variabile (tipicamente chiamata “top”) punta
all'elemento dell'array nel quale avverrà il prossimo
inserimento.
Novembre 2013
9
12. Stack statico: programma di esempio
public static void main(String args[]) {
StackStatico s=new StackStatico();
s.push(new Integer(83));
s.push(new Integer(12));
s.push(new Integer(67));
while (!s.isEmpty()) {
System.out.println(s.pop());
}
}
Novembre 2013
12
13. Problema
Obbligo di definire le dimensioni massime
→ possibilità di eccedere le dimensioni stabilite (“stack
overflow”) se la nostra stima è troppo bassa.
→ spreco di memoria, se la nostra stima è troppo alta
Novembre 2013
13
14. Alternativa?
Si!
Possiamo implementare lo stack in modo
dinamico, cioè utilizzando quella parte di memoria
RAM che non è utilizzata da nessun processo ed è
a disposizione (tale memoria è chiamata memoria
heap, o “mucchio di memoria”)
Utilizzeremo così solo la memoria che ci serve (o
quasi)
Novembre 2013
15. La struttura dell'oggetto
Per farlo, dovremo utilizzare un oggetto molto
diverso, formato da due attributi
il campo informativo (dato) che contiene l'oggetto
un puntatore la seconda è un puntatore che punta
all'elemento successivo (idealmente, una “freccia”)
Novembre 2013
15
18. Inizializzazione
Dovremo sempre avere modo di recuperare il
primo elemento dello stack: chiameremo top la
variabile che punta all'elemento in cima allo stack;
Tale variabile sarà nel main (e la chiameremo s)
s = new StackDinamico();
Novembre 2013
18
20. Questo elemento serve solo a “segnare” la fine
dello stack, e non contiene oggetti. E' gestito dal
costruttore
Novembre 2013
20
21. Inizializzazione
In sostanza, l'inizializzazione è gestita totalmente
dal costruttore, che dovrà fare due cose:
Settare a null il puntatore all'elemento successivo
Settare a null il puntatore al dato (non ci sono dati,
infatti – e in questo primo elemento non ci saranno
mai.)
Novembre 2013
21
22. Inserimento di un elemento (PUSH)
Per inserire un elemento nello stack, dobbiamo
utilizzare il metodo push(). Al suo interno, dovremo
creare un nuovo elemento in una variabile di
appoggio, poi questo nuovo elemento diverrà il nuovo
elemento “più in alto dello stack”. Dopo aver inserito
l'informazione, lo agganceremo allo stack
preesistente;
Novembre 2013
22
32. Eliminazione di un elemento (POP)
Come funziona il metodo pop()? Ancora più
semplice.
Stacchiamo il primo elemento (se esiste) dal resto
dello stack, assegnandolo alla variabile t
“Andiamo avanti” di un posto
Restituiamo l'oggetto contenuto
Poniamo t=null (opzionale). Privo di riferimenti, la
memoria allocata torna disponibile. (In C/C++ va
deallocata manualmente)
Novembre 2013
32
43. Migliorabile?
Certamente si...
Non permette di “osservare” il dato nello stack senza
toglierlo
Non sappiamo quanti elementi contiene
Altri miglioramenti, al vostro buon cuore
Novembre 2013
43
44. Migliorabile?
Realizzate quindi un programma che inserisca
diversi oggetti nello stack e li estragga.
Implementate ENTRAMBE le versioni (statiche e
dinamiche) dello stack, con la stessa interfaccia
pubblica.
Il programma di prova deve funzionare in modo
identico con le due implementazioni.
Novembre 2013
44