• Non ci sono risultati.

1 Liste ad accesso ristretto

N/A
N/A
Protected

Academic year: 2021

Condividi "1 Liste ad accesso ristretto"

Copied!
3
0
0

Testo completo

(1)

Azzolini Riccardo 2019-03-11

Pila e coda

1 Liste ad accesso ristretto

Le liste ad accesso ristretto sono strutture dati dinamiche elementari. Rispetto a una comune lista, esse hanno solo operazioni che agiscono su posizioni specifiche. Le principali sono la pila e la coda.

2 Pila

La pila è una struttura LIFO, con le operazioni:

Is_empty(S) =

{1 se S = Λ 0 altrimenti

Top(S) =

{an se S = (a1, . . . , an)

⊥ se S = Λ Pop(S) =

{(a1, . . . , an−1) se S = (a1, . . . , an)

se S = Λ

Push(S, a) = {

(a1, . . . , an, a) se S = (a1, . . . , an)

(a) se S = Λ

Osservazione: Queste operazioni possono essere definite equivalentemente sul primo elemento della lista, anziché sull’ultimo.

2.1 Implementazione con una lista concatenata Procedura Is_empty(S)

if S = nil then return Vero else return Falso Procedura Top(S)

1

(2)

return (∗S).elem Procedura Pop(S)

if Is_empty(S) then return −1;

else begin

S := (∗S).succ;

return 0;

end

Procedura Push(S, a) begin

X := Crea_nodo(a);

(∗X).succ := S;

S := X;

end

Tutte queste operazioni hanno costo costante, cioè O(1) = Θ(1).

3 Coda

La coda è una struttura FIFO, sulla quale sono definite le operazioni:

Is_empty(Q) =

{1 se Q = Λ 0 altrimenti

Top(Q) =

{a1 se Q = (a1, . . . , an)

⊥ se Q = Λ Dequeue(Q) =





Λ se Q = (a1)

(a2, . . . , an) se Q = (a1, . . . , an)

se Q = Λ

Enqueue(Q, a) = {

(a1, . . . , an, a) se Q = (a1, . . . , an)

(a) se Q = Λ

2

(3)

3.1 Implementazione con una lista concatenata

Una coda può essere implementata con una lista concatenata, in modo simile a una pila.

Per poter effettuare l’operazione Enqueue in tempo costante, senza dover scorrere l’intera lista, è necessario un puntatore anche all’ultimo nodo.

3.2 Implementazione con un vettore

Se è nota la dimensione massima della coda, si può utilizzare un’implementazione basata su un vettore gestito in modo circolare, sulla quale le operazioni hanno uguale complessità asintotica ma fattori costanti minori.

Dato un vettore di n elementi, per utilizzarlo come coda è necessario tenere traccia di due indici:

p: l’indice del primo elemento;

u: l’indice in cui verrà inserito il prossimo elemento.

L’operazione Enqueue inserisce quindi un elemento in posizione u e incrementa questa variabile, assegnando come nuovo valore u + 1 mod n.

L’operazione Dequeue, invece, incrementa allo stesso modo la variabile p, rimuovendo effettivamente il primo elemento.

Se p = u, la coda può essere piena o vuota: per distinguere tra queste due situazioni è necessaria un’apposita variabile booleana.

3

Riferimenti

Documenti correlati

I protocolli per la condivisione dei file possono anche essere utilizzati come protocolli per il trasferimento dei file, ma principalmente consentono di usare un file come se

Ora, un punto che partendo da O si sposta prima nel punto di coordinate v1 , v2 , 0 e poi si sposta di v3 unita’ nella direzione dell’asse z, descrive i due cateti di un

ottenuta da lista cancellando il primo elemento e tutte le occorrenze di elem dal resto di lista (caso ricorsivo). altrimenti ris ` e ottenuta da lista cancellando tutte le

In che modo abbiamo dimostrato che la somma delle ampiezze degli angoli interni di un triangolo è pari all'ampiezza di un angolo piatto?. Prova a riscrivere

Colora in modo uguale

• quando la coda è stata appena creata, il primo inserimento avviene nella prima posizione. • gli inserimenti consecutivi di seguito, in posizioni

[r]

La funzione crea_lista() crea due puntatori ad elemento, uno di nome p (puntatore al primo elemento della lista) e l'altro di nome punt (puntatore che permette di scorrere la