Definizione
un ADT (Abstract Data Type) è un modello (formale) che generalizza ed estende i tipi di dato primitivi e le operazioni definite su di essi;
Un ADT (es. contatore) è connotato da:
consente pertanto di estendere l’insieme dei tipi di dato predefiniti del linguaggio.
La pila
Una pila (detta anche stack) è un ADT in cui l’accesso ai dati è realizzato con strategia LIFO (Last In First Out): l’operazione di estrazione restituisce l’elemento più recentemente inserito.
I metodi sono:
init
, crea e inizializza un’istanza vuota dell’ADT;push
, inserisce un elemento;pop
, estrae l’elemento più recentemente inserito;empty
, restituisce vero se la pila è vuota, viceversa falso;destroy
, elimina l’istanza dell’ADT.La coda
una coda è un ADT in cui l’accesso ai dati è realizzato con strategia FIFO (First In First Out): l’operazione di estrazione restituisce l’elemento presente da più tempo.
I metodi sono:
init
, crea e inizializza un’istanza vuota dell’ADT;enqueue
, inserisce un elemento;dequeue
, estrae l’elemento presente da più tempo;empty
, restituisce vero se la coda è vuota, viceversa falso;destroy
, elimina l’istanza dell’ADT.È possibile realizzare uno stack utilizzando una lista concatenata. Si può definire un nuovo tipo di dato
elem
come:
struct elem{
data d;
struct elem *next;
};
typedef struct elem elem;
È possibile definire lo stack mediante una dichiarazione del tipo:
struct stack {
int cnt;
elem *top;
};
typedef struct stack stack;
Le funzioni da implementare sono:
void initialize(stack *stk);
utilizzata per inizializzare lo stack.
void push(data d, stack *stk);
utilizzata per inserire all’interno dello stack.
void pop(data *d, stack *stk);
utilizzata per estrarre dallo stack.
boolean empty(const stack *stk);
Per verificare quando lo stack è vuoto.
In particolare la funzione push
deve prevedere i seguenti passi fondamentali:
In particolare la funzione pop
deve prevedere i seguenti passi fondamentali:
stack.h
Header file
In questa parte di codice scritto in Linguaggio C si descrive come puo’ essere sviluppato un header file dal nome stack.h
per la gestione di uno stack.
Problema
Sviluppare in linguaggio C un programma per una gestione di una Pila ( Stack ) basata su array, che implementi si seguenti i principali metodi:
Osservazione
La Pila e’ un insieme ordinato di elementi. L’ ordine degli elementi nella pila e’ determinato dalle operazioni di inserimento e prelievo.
L’inserimento ed il prelievo avvengono ad una estremita’ dell’insieme detta cima della pila.
Esempi di applicazione della struttura Pila si trovano:
* nella gestione dell’indirizzo della prossima istruzione nelle chiamate ( eventualmente nidificate ) a sottoprogrammi.
* nella verifica dell’accoppiamento delle parentesi aperte e chiuse in una espressione.
La pila
In questa parte di codice scritto in Linguaggio C si descrive un programma di tipo main che richiama diversi moduli per la gestione di una pila.
La pila: funzioni principali
Descriviamo alcuni dettagli di tipo realizzativo.
s
puntatore alla struttura definita TipoStack
costituita da:
array
puntatore all’array di elementi.maxElem
variabile che contiene il numero degli elementi dell’array puntato da array.
Inoltre:
s->array
indirizzo dell’array di elementi ovvero nome dell’array di elementi.
s->itop
indice corrente della pila.
s->array[s->itop]
valore dell’elemento dell’array s->array
di indice s->itop.
La pila: funzioni principali
void push(TipoStack *s, tipoElemento data)
, inserisce un elemento nella pila.pop(TipoStack *s)
estrae un elemento dalla pila.top(TipoStack *s)
, ritorna il primo elemento della pila.La pila: funzioni principali
int size(TipoStack *s)
, ritorna la lunghezza della pila.void destroy(TipoStack *s)
, distrugge la la memoria allocata per la pila.void deleteElement(TipoStack *s, tipoElemento data)
, elimina un elemento della pila medinante la definizione delle operazioni ammesse per una pila: inserimento e prelievo dei dati solo dalla cima (top) della struttura.1. Prolusione
2. Sistemi Operativi – parte prima
3. Sistemi Operativi – parte seconda
6. Il linguaggio C – parte prima
8. Il linguaggio C – funzioni e puntatori
10. Il linguaggio C – parte terza
11. La documentazione del software
12. Dati strutturati
13. Esercizi sui dati strutturati
14. Approfondimenti di C, Stringhe e file
15. Esercizi su stringhe e file
16. La ricorsione
17. Il linguaggio c++ parte prima
18. Il linguaggio C++ - parte seconda
19. Strutture dati di tipo astratto
Donald Knuth. The Art of Computer Programming, Volume 1: Fundamental Algorithms, Third Edition.Addison-Wesley, 1997. ISBN 0-201-89683-4. Section 2.2.1: Stacks, Queues, and Deques, pp. 238--243.