Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
di dati?
Struttura Insiemi finiti di dati
astratta di tra i quali esistono
dati delle relazioni logiche.
Ha la funzione di un contenitore
che può essere riempito con dati di
volta in volta di tipo diverso.
? Elenco telefonico
1
Operazioni relative alle strutture dati
2
Struttura astratta di dati
3
Strutture informative
significative
? Array
? Tabelle
? Lista lineare
? Lista concatenata
? Pila
? Coda
? Grafi
? Alberi
La Pila
Una pila (detta anche STACK) è una struttura
dati lineare, i cui elementi possono essere inseriti
o estratti da un’unica estremità (LIFO).
4
5
6
7
Modalità d’impiego delle pile
? La pila è un tipo di dato astratto che trova impiego
nell’organizzazione dei dati in memoria centrale in
molti sistemi operativi, nonché nella memorizzazione
degli indirizzi di ritorno delle funzioni.
? Tale struttura è comune nei processi nei quali un
problema in corso d’esame viene lasciato
temporaneamente sospeso per affrontare un
sottoproblema che, a sua volta è lasciato in sospeso,
per affrontare un nuovo sottoproblema e così via
finché l’ultimo sottoproblema generato è messo in
testa alla pila dei vari sottoprogrammi da risolvere.
8
Operazioni sulle Pile
Le operazioni che si possono definire per una
pila (stack) sono:
? Push: aggiunge nuovo elemento alla pila.
? Pop: elimina l’elemento emergente dalla pila
restituisce l’elemento inserito da meno tempo!
? TopElem: restituisce il valore del primo elemento
della pila, senza estrarlo.
? IsEmpty: per verificare se la pila è vuota
(restituisce true se la pila non ha elementi).
? IsFull: per verificare se la pila è piena.
? Clear: per cancellare tutti i dati.
9
La pila come struttura statica
? L’indice deve tener conto di quanti elementi
ci sono nella pila.
? Si utilizza un array per memorizzare gli
elementi e un numero intero che indica la
prima posizione libera dello stack.
10
11
Pile realizzate con vettori (1)
typedef struct stackframe {
s
int dim; // dimensioni pila
int top_el; // indice emergente
T* vel; // vettore elementi
dim } StackFrame;
top_el typedef StackFrame* Stack;
12
Pile realizzate con vettori (2)
Stack NewStack(int n)
// alloca una pila di max n elementi
{ Stack s = (Stack) malloc (sizeof(StackFrame));
s->dim = n; s->top_el = -1;
s->vel = (T*) malloc (sizeof(T)*n);
return s;
}
void DeleteStack(Stack s) // deallocatore
{ free(s->vel); free(s);
}
13
Pile realizzate con vettori (4)
void Pop(Stack s)
// pre: s non e’ vuoto
// post: rimuove l’elemento emergente da s
{ s->top_el--;}
T Top(Stack s)
// pre: s non e’ vuoto
// post: ritorna il valore dell’el. emergente in s
{ return s->vel[top_el];}
boolean IsEmpty(Stack s) // true se s e’ vuota
{ return s->top_el == -1;}
14
Algoritmo di valutazione
Valuta (Stringa espr)
// espr è fatta di parole separate da spazi
s := pila vuota
while (scansione di espr non è finita)
e := prossima parola di espr;
if (e è un numerale) then Push(e,s)
else // e è un operatore
n := Top(s); Pop(s); // l’ordine di lettura ed eliminaz.
m := Top(s); Pop(s); // dalla coda è importante …
op := ????? oppure ? a seconda di e;
Push(m op n, s) // … qui
return Top(s). // se espr è un’espr. in not. polacca, s ha un solo el.
Esecuzione dell’algoritmo
4 8 7 3 + ? ? ? ?
top 4
15
Esecuzione dell’algoritmo
4 8 7 3 + ? ? ? ?
top 8
4
Esecuzione dell’algoritmo
4 8 7 3 + ? ? ? ?
top 7
8
4
16
Esecuzione dell’algoritmo
4 8 7 3 + ? ? ? ?
top 3
7
8
4
Esecuzione dell’algoritmo
4 8 7 3 + ? ? ? ?
top 10
8
4
17
Esecuzione dell’algoritmo
4 8 7 3 + ? ? ? ?
top 80
4
Esecuzione dell’algoritmo
4 8 7 3 + ? ? ? ?
top 2
80
4
18
Esecuzione dell’algoritmo
4 8 7 3 + ? ? ? ?
top 40
4
Esecuzione dell’algoritmo
4 8 7 3 + ? ? ? ?
top 44
19
Gestione statica e gestione dinamica
Le aree di memoria richieste dal
codice sorgente vengono
Gestione predisposte dal compilatore
statica attraverso la dichiarazione delle
variabili e allocate all’avviamento
del programma eseguibile.
dati
Si distingue una 2
parte di dati e una
link
parte di puntatori
di collegamento dati
1
(link). link
20
typedef struct PilaElem *TipoPila;
struct PilaElem {
TipoElemPila val;
TipoPila next;
};
bool TestPilaVuota(TipoPila p)
{
return (p == NULL);
} /* TestPilaVuota */
21
void TopPila(TipoPila p, TipoElemPila *v)
{
if (TestPilaVuota(p))
printf("ERRORE: PILA VUOTA\n");
else
*v = p->val;
} /* TopPila */
22
void Pop(TipoPila *p, TipoElemPila *v)
{
TipoPila paux;
if (TestPilaVuota(*p))
printf("ERRORE: PILA VUOTA\n");
else {
*v = (*p)->val;
paux = *p;
*p = (*p)->next;
free(paux);
}
} /* Pop */
23