Sei sulla pagina 1di 19

Algoritmi e Strutture Dati

Lezione 6
Lista ordinata, Stack, Coda
Oggi parleremo di …

Struttura dati Lista ordinata


Struttura dati Stack
 definizione
 rappresentazione
Struttura dati Coda
 definizione
 rappresentazione
 coda circolare
La struttura dati Lista ordinata

Una lista ordinata di n0 elementi è definita come una sequenza


L=l0,…,ln-1.
Il termine li rappresenta il generico elemento o atomo appartenente
ad un certo insieme.

Le operazioni possibili sono


 trovare la lunghezza di una lista
 leggere gli elementi di una lista da sin a des (o da des a sin)
 estrarre l’i-esimo elemento da una lista, 0in-1
 sostituire l’elemento nella posizione i-esima, 0in-1
 inserire un nuovo elemento nella posizione i-esima, 0in-1. Gli elementi
precedentemente numerati i, i+1,…, n-1 diventano i+1, i+2, .., n
 cancellare un elemento dalla i-esima posizione di una lista, 0in-1. Gli
elementi precedentemente numerati i+1,…, n-1 diventano i, i+1, …, n-2.
La Lista ordinata: rappresentazione

Una lista ordinata viene comunemente rappresentata con


un array, dove si associa il generico elemento della lista li
con l’indice i dell’array.
Gli elementi successivi li e li+1 vengono inseriti nelle
posizioni successive i e i+1 dell’array.
Ogni operazione di accesso avviene in tempo costante
O(1).
L’inserimento e la cancellazione creano problemi
computazionali
 si ricorre alla rappresentazione non sequenziale, ovvero
mediante liste concatenate.
La struttura dati Stack

Uno stack o pila è una lista ordinata in cui


l’inserimento e la cancellazione avvengono in una
posizione predeterminata, una estremità della lista
detta top (o testa).

Uno stack implementa una


lista di tipo “Last In, First Out” top
(LIFO) NO!
 nuovi elementi vengono inseriti in
testa e prelevati dalla testa.
La struttura dati Stack: applicazioni

Un'applicazione della pila è quella che permette al S.O. di


memorizzare gli indirizzi di memoria delle istruzioni a cui
tornare dopo l'esecuzione di sottoprogrammi che si attivano
in sequenza
 ad ogni chiamata di un sottoprogramma, il S.O. memorizzerà in una
pila l'indirizzo dell'istruzione successiva, per poi poterlo utilizzare al
momento opportuno.
Un'altra applicazione è quella che permette al S.O. di gestire
l'utilizzo dei settori liberi sul disco
 la Free Sector List è una lista, utilizzata con la regola LIFO, in cui gli
elementi indicati vengono prelevati o aggiunti (per comodità) alla
prima posizione.
La struttura dati Stack

Struttura Stack
Dati: una lista ordinata di zero o più elementi
Operazioni:
CreaS(max_stack_size)  Stack
crea uno stack vuoto la cui dimensione massima è max_stack_size
Pieno(stack, max_stack_size)  Booleano
if (numero di elementi in stack è uguale a max_stack_size) return TRUE,
else return FALSE
Vuoto(stack)  Booleano
if (stack=CreaS(max_stack_size)) return TRUE else return FALSE
Add(stack, item)  Stack
if (Pieno(stack, max_stack_size)) stack_full, else inserisci item in cima allo stack
e return
Delete(stack)  Elemento
if (Vuoto(stack)) stack_empty, else elimina l’elemento in cima allo stack e
restituiscilo
Inserimento e cancellazione: esempi

c  top d  top
b  top b b  top b b  top
a  top a a a a a

Add Add Delete Add Delete


Implementazione di uno Stack

Mediante Arrays
 permettono di implementare stack in modo semplice
 flessibilità limitata, ma incontra parecchi casi di utilizzo
 la capacità dello Stack è limitata.
Mediante Liste concatenate.

algoritmo Vuoto(intero top)  Booleano algoritmo Pieno(intero top)  Booleano

if (top<0) then return TRUE if (top= MAX_SIZE-1) then return TRUE


else return FALSE else return FALSE

algoritmo Add(intero top, elemento item) algoritmo Delete(intero top)  elemento

if (top = MAX_SIZE-1) then return error “overflow” if (top = -1) then return error “underflow”
else top  top+1 else top  top-1
stack[top]  item return stack[top+1]
La struttura dati Coda

Una coda è una lista ordinata in cui l’inserimento


e la cancellazione avvengono in una posizione
predeterminata
 gli inserimenti avvengono ad un estremo e le
cancellazioni avvengono all’estremo opposto.

Una coda implementa una lista di tipo “First In, First Out” (FIFO)
 può essere cancellato l’elemento che per più tempo è rimasto nell’insieme
 una coda possiede una testa (davanti) e una coda (dietro)
 quando si aggiunge un elemento, viene inserito in fondo alla coda
 quando si rimuove un elemento, viene estratto quello in testa
La struttura dati Coda: applicazioni

La coda trova varie applicazioni in campo informatico


 viene utilizzata dal S.O. per gestire le richieste di risorse da
parte di più utenti (in alcuni casi gli utenti sono dei dispositivi
hardware)
 per esempio le stampanti
 viene utilizzata come struttura dati ausiliaria di alcuni algoritmi.
In generale, serve a gestire una lista di attesa per la
fruizione di un servizio.
La struttura dati Coda

Struttura Coda
Dati: una lista ordinata di zero o più elementi
Operazioni:
CreaC(max_coda_size)  Coda
crea una coda vuota la cui dimensione massima è max_coda_size
CPiena(coda, max_coda_size)  Booleano
if (numero di elementi in coda è uguale a max_coda_size) return TRUE,
else return FALSE
CVuota(coda)  Booleano
if (coda=CreaC(max_coda_size)) return TRUE else return FALSE
AddC(coda, item)  Coda
if (CPiena(coda, max_coda_size)) coda_full, else inserisci item in fondo alla
coda e return coda
DeleteC(coda)  Elemento
if (CVuota(coda)) coda_empty, else elimina l’elemento in testa alla coda e
restituiscilo
Inserimento e cancellazione: esempi

d  dietro d  dietro

c  dietro c  dietro c c
b  dietro b b b  davanti

a  dietro a a  davanti  davanti


 davanti  davanti  davanti

AddC AddC DeleteC AddC DeleteC


Implementazione di una Coda

La più semplice utilizza un array monodimensionale e due


indici, davanti e dietro
 davanti punta alla testa della coda
 dietro punta in fondo alla coda
 inizialmente
 dietro  -1
 davanti  -1

dietro
davanti
Implementazione delle funzioni

algoritmo CVuota(intero davanti , dietro)  Booleano algoritmo CPiena(intero dietro)  Booleano

if (davanti=dietro) then return TRUE if (dietro=MAX_SIZE-1) then return TRUE


else return FALSE else return FALSE

algoritmo AddC(intero dietro, elemento item) algoritmo DeleteC(intero davanti, dietro)  elemento

if (dietro=MAX_SIZE-1) then return error “overflow” if (davanti=dietro) then return error “underflow”
else dietro  dietro+1 else davanti  davanti+1
coda[dietro]  item return coda[davanti]
La Coda circolare
2 3 2 3 2 3
b b c

1 4 1 a 4 1 d 4

e
0 5 0 5 0 5
davanti = 0 Coda davanti = 0 davanti = 1
dietro = 0 vuota dietro = 2 dietro = 5
2 3 2 3 2 3
b c c

1 d 4 1 d 4 1 g d 4

f e f e f e
0 5 0 5 0 5
davanti = 1 Coda davanti = 2 davanti = 3
dietro = 0 piena dietro = 0 dietro = 1
Coda circolare : implementazione

Per poter distinguere una coda piena da una coda vuota si


adotta la convenzione che una coda circolare di
dimensione MAX_SIZE può contenere al massimo
MAX_SIZE – 1 elementi.
 inizialmente
 dietro  0
 davanti  0

La rotazione circolare avviene mediante una operazione


di modulo
dietro  (dietro + 1) % MAX_SIZE
davanti  (davanti + 1) % MAX_SIZE
Implementazione di AddC e DeleteC

algoritmo AddC(intero davanti, dietro, elemento item)

dietro  (dietro + 1) % MAX_SIZE


if (dietro=davanti) then
ripristina dietro;
return error “overflow”
else coda[dietro]  item

algoritmo DeleteC(intero davanti, dietro)  elemento

if (davanti=dietro) then return error “underflow”


else davanti  (davanti+1) % MAX_SIZE
return coda[davanti]
Riassumendo …

Le strutture dati Lista ordinata, Stack e Coda.


Implementazione mediante arrays.

La prossima volta descriveremo le


implementazioni delle strutture dati Lista
ordinata, Stack e Coda mediante concatenamenti.

19