Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Riassunto Stack e Coda, Sintesi del corso di Algoritmi E Strutture Di Dati

Riassunto della struttura algoritmica di stack e code in linguaggio di programmazione C

Tipologia: Sintesi del corso

2019/2020

Caricato il 01/11/2020

gd_bnc
gd_bnc 🇮🇹

5

(4)

18 documenti

1 / 3

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
LO STACK
Lo stack è una struttura dati la cui modalità d'accesso segue una politica LIFO (Last In First Out), ovvero tale per cui i dati vengono estratti (letti)
in ordine rigorosamente inverso rispetto a quello in cui sono stati inseriti (scritti).
Operazioni principali sullo stack:
1. 􀂃 Inizializzazione inizializza le strutture dati per l’utilizzo dello stack
2. 􀂃 Inserimento aggiunge un elemento in cima allo stack (precondizione: stack non pieno)
3. 􀂃 Cancellazione rimuove un elemento dalla cima dello stack (precondizione: stack non vuoto)
4. 􀂃 Verifica Stack Vuoto verifica se lo stack è vuoto (ritorna true o false)
5. 􀂃 Verifica Stack Pieno verifica se lo stack è pieno (ritorna true o false)
Vi sono diverse possibilità per l’implementazione dello stack:
1.
VETTORE STATICO
implementazione tramite un vettore statico ed un puntatore (stack pointer - sp) che punta all’ultima cella
occupata; nell’implementazione tramite vettore statico sp è semplicemente un intero.
Le condizioni di stack vuoto e stack pieno, nell’implementazione statica, diventano:
STACK VUOTO sp = -1
STACK PIENO sp = DIM-1 (con DIM = dimensione massima del vettore).
Prototipi delle operazioni su stack (di interi):
Inizializzazione: il puntatore sp viene inizializzato a -1 per indicare che lo stack è vuoto ed è pronto per l’uso
void init(int *sp) {
*sp = -1;
}
Inserimento: si aggiorna il puntatore sp alla nuova cella e si inserisce l’elemento nella nuova posizione sp
void push(int elem, int v[], int *sp) {
*sp = *sp + 1;
v[*sp] = elem;
}
Cancellazione: si estrae il valore di v nella posizione sp, si aggiorna sp alla posizione precedente e si ritorna il valore estratto
void pop(int v[], int *sp) {
int temp = v[*sp];
*sp = *sp - 1;
return temp;
}
Verifica stack vuoto: si deve verificare la condizione, definita precedentemente, per lo stack vuoto
void isEmpty(int sp) {
if (sp==-1)
return 1;
else
return 0;
pf3

Anteprima parziale del testo

Scarica Riassunto Stack e Coda e più Sintesi del corso in PDF di Algoritmi E Strutture Di Dati solo su Docsity!

LO STACK

Lo stack è una struttura dati la cui modalità d'accesso segue una politica LIFO (Last In First Out), ovvero tale per cui i dati vengono estratti (letti) in ordine rigorosamente inverso rispetto a quello in cui sono stati inseriti (scritti). Operazioni principali sullo stack:

  1. 􀂃 Inizializzazione → inizializza le strutture dati per l’utilizzo dello stack
  2. 􀂃 Inserimento → aggiunge un elemento in cima allo stack (precondizione: stack non pieno)
  3. 􀂃 Cancellazione → rimuove un elemento dalla cima dello stack (precondizione: stack non vuoto)
  4. 􀂃 Verifica Stack Vuoto → verifica se lo stack è vuoto (ritorna true o false)
  5. 􀂃 Verifica Stack Pieno → verifica se lo stack è pieno (ritorna true o false) Vi sono diverse possibilità per l’implementazione dello stack:

1. VETTORE STATICO → implementazione tramite un vettore statico ed un puntatore (stack pointer - sp) che punta all’ultima cella

occupata; nell’implementazione tramite vettore statico sp è semplicemente un intero. Le condizioni di stack vuoto e stack pieno, nell’implementazione statica, diventano: STACK VUOTO → sp = - 1 STACK PIENO → sp = DIM-1 (con DIM = dimensione massima del vettore). Prototipi delle operazioni su stack (di interi):

  • Inizializzazione: il puntatore sp viene inizializzato a - 1 per indicare che lo stack è vuoto ed è pronto per l’uso void init(int *sp) { *sp = - 1; }
  • Inserimento: si aggiorna il puntatore sp alla nuova cella e si inserisce l’elemento nella nuova posizione sp void push(int elem, int v[], int *sp) { *sp = sp + 1; v[sp] = elem; }
  • Cancellazione: si estrae il valore di v nella posizione sp, si aggiorna sp alla posizione precedente e si ritorna il valore estratto void pop(int v[], int sp) { int temp = v[sp]; *sp = *sp - 1; return temp; }
  • Verifica stack vuoto: si deve verificare la condizione, definita precedentemente, per lo stack vuoto void isEmpty(int sp) { if (sp==-1) return 1; else return 0;

}

  • Verifica stack pieno: si deve verificare la condizione, definita precedentemente, per lo stack pieno void isFull(int sp) { if (sp==DIM-1) return 1; else return 0; }

2. VETTORE DINAMICO

3. LISTA DINAMICA

LA CODA

La coda è una struttura dati la cui modalità d'accesso segue una politica FIFO (First In First Out), ovvero tale per cui i dati vengono estratti (letti) nello stesso ordine con il quale sono stati inseriti. Operazioni principali sulla coda:

  1. Inizializzazione → inizializza le strutture dati per l’utilizzo della coda
  2. Inserimento → aggiunge un elemento in fondo alla coda (precondizione: coda non piena)
  3. Cancellazione → rimuove un elemento dalla cima della coda (precondizione: coda non vuota)
  4. Verifica Coda Vuota → verifica se la coda è vuota (ritorna true o false)
  5. Verifica Coda Piena → verifica se la coda è piena (ritorna true o false) Vi sono diverse possibilità per l’implementazione della coda:

1. VETTORE STATICO → Implementazione tramite un vettore statico e due puntatori, last e first, che puntano, rispettivamente, alla prima

cella libera e alla cella che contiene il primo elemento inserito; nell’implementazione tramite vettore statico first e last sono semplicemente degli interi. Le condizioni di coda vuota e coda piena, nell’implementazione statica e con la tecnica della coda circolare, diventano: CODA VUOTA → first è uguale a last (first==last) CODA PIENA → last si trova nella cella immediatamente precedente (considerando la circolarità) a first ((last+1)%DIM==first, con DIM = dimensione massima del vettore) Prototipi delle operazioni su coda (di interi):

  • Inizializzazione: i puntatori last e first vengono inizializzati a 0 per indicare che la coda è vuota ed è pronta per l’uso void init(int *last, int *first){ *last = 0; *first = 0; }
  • Inserimento: si inserisce l’elemento nella nuova posizione last e si aggiorna (circolarmente) il puntatore last alla nuova cella void push(int elem, int v[], int *first, int last) { v[last] = elem;