際際滷

際際滷Share a Scribd company logo
Strutture dati: Stack
Un'introduzione (soft) alle variabili dinamiche
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
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
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
Schema UML

Novembre 2013

5
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
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
E allora?
Sono possibili due implementazioni

Novembre 2013

8
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
Implementazione statica (1/2)
public油class油StackStatico油extends油Stack{
油油油油public油static油final油int油SIZE油=油100;
油油油油private油int油top;
油油油油private油Object油arr[];
油油油油StackStatico()油{arr=new油Object[SIZE];
油油油油油油油油top=0;};
油油油油public油Object油pop(){
油油油油油油油油if油(isEmpty())油return油null;
油油油油油油油油return油arr[足足top];油};op());油油}

Novembre 2013

10
Implementazione statica (2/2)
public油class油StackStatico油extends油Stack{
油油油油public油void油push(Object油obj)油{
油油油油油油油油arr[top++]=obj;
油油油油}
油油油油public油boolean油isEmpty()油{
油油油油油油油油return油top==0;
油油油油};
}

Novembre 2013

11
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
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
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
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
Novembre 2013

16
La struttura

public油class油StackDinamico油{
private油Object油obj;
private油StackDinamico油next;
public油StackDinamico()油{};
public油Object油pop(){};
public油void油push(Object油o)油{}
public油boolean油isEmpty(){};
}

Novembre 2013

17
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
Graficamente...
s=new StackDinamico();
MEMORIA HEAP

s
t

Novembre 2013

19
Questo elemento serve solo a segnare la fine
dello stack, e non contiene oggetti. E' gestito dal
costruttore

Novembre 2013

20
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
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
Graficamente...
StackDinamico t=new StackDinamico();
MEMORIA HEAP

s
t

Novembre 2013

23
Graficamente...
t.obj=o; // object 竪 un Integer con valore 83
MEMORIA HEAP

s
t

Novembre 2013

83

24
Graficamente...
t.next=s.next;
MEMORIA HEAP

s
t

Novembre 2013

83

25
Graficamente...
s.next=t;
MEMORIA HEAP

s
t

Novembre 2013

83

26
Graficamente...
Ripetiamo il codice, ma questa volta inseriamo 12
MEMORIA HEAP

s
t

Novembre 2013

83

27
Graficamente...
t=new StackDinamico();
MEMORIA HEAP

s
t

Novembre 2013

83

28
Graficamente...
t.o=object;//object 竪 un Integer con valore 12
MEMORIA HEAP

s
t

83
12

Novembre 2013

29
Graficamente...
t.next=s.next;
MEMORIA HEAP

s
t

83
12

Novembre 2013

30
Graficamente...
s.next=t;
MEMORIA HEAP

s
t

83
12

Novembre 2013

31
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
Graficamente...

MEMORIA HEAP

s
t

83
12

Novembre 2013

33
Graficamente...
if (s.next==null) return null;
MEMORIA HEAP

s
t

83
12

Novembre 2013

34
Graficamente...
t=s;
MEMORIA HEAP

s
t

83
12

Novembre 2013

35
Graficamente...
s=s.next;
MEMORIA HEAP

s
t

83
12

Novembre 2013

36
Importante!
L'assegnazione di puntatori significa: puntano allo
MEMORIA HEAP
stesso oggetto
s
t

83
12

Novembre 2013

37
Importante!
return t.o;//restituisce l'oggetto
MEMORIA HEAP

s
t

83

out

12

Novembre 2013

38
Importante!
Al termine del metodo, la variabile t scompare
MEMORIA HEAP

s
t

83
12

Novembre 2013

39
Importante!
Al termine del metodo, la variabile t scompare
MEMORIA HEAP

s
t

83
12

Novembre 2013

40
Importante!
Priva di riferimenti, la memoria torna nell'heap
MEMORIA HEAP

s
83

Novembre 2013

41
Confronto tra le due implementazioni

Novembre 2013

42
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
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
BUON LAVORO

Novembre 2013

45

More Related Content

Viewers also liked (15)

Corso Moodle: presentazione
Corso Moodle: presentazioneCorso Moodle: presentazione
Corso Moodle: presentazione
Marcello Missiroli
Uefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il maleUefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il male
Marcello Missiroli
Dhcp
DhcpDhcp
Dhcp
Marcello Missiroli
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
Marcello Missiroli
L'avvento del programmatore sociale
L'avvento del programmatore socialeL'avvento del programmatore sociale
L'avvento del programmatore sociale
Marcello Missiroli
Eccezioni in java
Eccezioni in javaEccezioni in java
Eccezioni in java
Marcello Missiroli
Moodle: i compiti (homework)
Moodle: i compiti (homework)Moodle: i compiti (homework)
Moodle: i compiti (homework)
Marcello Missiroli
Investire nelle user story
Investire nelle user storyInvestire nelle user story
Investire nelle user story
Marcello Missiroli
Routing dinamico
Routing dinamicoRouting dinamico
Routing dinamico
Marcello Missiroli
Espressioni regolari
Espressioni regolariEspressioni regolari
Espressioni regolari
Marcello Missiroli
The Sequel to sql
The Sequel to sqlThe Sequel to sql
The Sequel to sql
Marcello Missiroli
Controllo di versione e Git
Controllo di versione e GitControllo di versione e Git
Controllo di versione e Git
Marcello Missiroli
Introduzione al dns
Introduzione al dnsIntroduzione al dns
Introduzione al dns
Marcello Missiroli
Il sistema binario
Il sistema binarioIl sistema binario
Il sistema binario
Marcello Missiroli
Insegnare Agile
Insegnare AgileInsegnare Agile
Insegnare Agile
Marcello Missiroli

More from Marcello Missiroli (12)

Algorithmist guide II
Algorithmist guide IIAlgorithmist guide II
Algorithmist guide II
Marcello Missiroli
Guida del perfetto Algoritmista I
Guida del perfetto Algoritmista IGuida del perfetto Algoritmista I
Guida del perfetto Algoritmista I
Marcello Missiroli
Workshop: Introduzione ad TDD
Workshop: Introduzione ad TDDWorkshop: Introduzione ad TDD
Workshop: Introduzione ad TDD
Marcello Missiroli
Dal c a Java (3/3)
Dal c a Java (3/3)Dal c a Java (3/3)
Dal c a Java (3/3)
Marcello Missiroli
Dal C a Java (2/3)
Dal C a Java (2/3)Dal C a Java (2/3)
Dal C a Java (2/3)
Marcello Missiroli
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
Marcello Missiroli
Variabili
VariabiliVariabili
Variabili
Marcello Missiroli
Sviluppo degli algoritmi
Sviluppo degli algoritmiSviluppo degli algoritmi
Sviluppo degli algoritmi
Marcello Missiroli
5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo
Marcello Missiroli
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
Marcello Missiroli
Big O Notation
Big O NotationBig O Notation
Big O Notation
Marcello Missiroli
Introduzione a java doc
Introduzione a java docIntroduzione a java doc
Introduzione a java doc
Marcello Missiroli

Lo stack: tipo di dato astratto e implementazione in Java