






Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Le specifiche sintassiche e semantiche di ADT Stack e Queue, ossia data structures last-in-first-out (LIFO) e first-in-first-out (FIFO) rispettivamente. Vengono presentate le operazioni di push, pop, top, empty, enqueue e dequeue, insieme alle loro specifiche semantiche. Inoltre, vengono discusse le implementazioni di stack e queue utilizzando array e liste collegate.
Tipologia: Appunti
1 / 11
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!







Uno stack è una sequenza di elementi di un determinato tipo, in cui è possibile aggiungere o togliere elementi, uno alla volta, esclusivamente da un unico lato (top dello stack). Questo significa che la sequenza viene gestita con la modalità detta LIFO (Last-in-first-out) cioè l’ultimo elemento inserito nella sequenza sarà il primo ad essere eliminato. Lo stack è una struttura dati lineare, omogenea, a dimensione variabile in cui si può accedere direttamente solo al primo elemento della lista. Non è possibile accedere ad un elemento diverso dal primo, cioè quello che è stato inserito per ultimo, se non dopo aver eliminato tutti gli elementi che lo precedono (cioè che sono stati inseriti dopo). Gli elementi di un ADT lista possono essere analizzati uno per uno, in modo sequenziale, mentre in uno stack ciò non si può fare. Specifica sintattica e semantica
Nel caso della realizzazione tramite array lo stack è implementato come un puntatore ad una 𝑠𝑡𝑟𝑢𝑐𝑡 𝑐_𝑠𝑡𝑎𝑐𝑘 che contiene due elementi: un array di MAXSTACK elementi e un intero che indica la posizione del top dello stack. L’intero top inoltre è utile anche per tenere conto della grandezza dello stack. Quando lo stack si riempie, non è possibile eseguire l’operazione push. L’ADT stack è realizzato in modo da non dipendere dal tipo degli elementi contenuti; utilizza il tipo generico item già visto in precedenza; pop e push restituiscono un intero che indica l’esito dell’operazione.
Implementazione dello stack con liste collegate: Il tipo stack è definito come un puntatore ad una struct che contiene: un intero numelem che indica il numero di elementi dello stack e un puntatore top ad una struct nodo (come per la lista).
Implementazione dello stack basata sull’uso del modulo lista: Il tipo stack è definito come un puntatore ad una struct che contiene un elemento top di tipo list. Non serve più nemmeno l’intero numelem che indica il numero di elementi dello stack. Anche se abbiamo un solo elemento nella struct, continuiamo a definire il tipo stack come puntatore a struct c_stack per non cambiare la definizione nell’header file. Implementazione di singola istanza di Stack con array: E se volessimo realizzare una sola istanza di stack? In questo caso non abbiamo bisogno di definire ed esportare un tipo. La struttura dati dello stack la manteniamo in variabili globali accessibili solo all’interno del modulo (dichiarazioni static). Gli operatori della lista non usano parametri di tipo stack, ma operano sulle variabili globali. In questo caso non c’è la definizione del tipo stack nell’header file, gli operatori non hanno parametri di tipo stack e gli operatori newStack, pop e push restituiscono un intero che indica il buon esito dell’operazione.
Il tipo di dato astratto presenta un modulo che incapsula la definizione del tipo e gli operatori ed esporta il nome del tipo e la signature degli operatori. Il tipo di riferimento compare tra i parametri degli operatori ed è consentito definire variabili di tale tipo (istanziazione) e utilizzarle (referenziazione) come parametri degli operatori. Un oggetto (astratto), invece, ha un modulo che incapsula una struttura dati (istanza) e gli operatori ed esporta la signature degli operatori. Non è consentito referenziare la struttura dati fuori dal modulo e l’uso e la manipolazione dell’oggetto sono consentiti unicamente attraverso i suoi operatori. Un oggetto ha uno stato che può cambiare in seguito all’applicazione di determinate operazioni. Un modulo generico è un template dal quale è possibile istanziare più moduli. È tipicamente parametrico rispetto a un tipo base o al numero di componenti di tipo base (parametri di struttura) Esempio: l’ADT (o oggetto) stack generico Un modulo cliente dovrebbe prima istanziare il modulo specificando i parametri di struttura. In C non abbiamo costrutti per fare questo: dobbiamo definire un tipo generico item e delle costanti, che possiamo cambiare all’occorrenza.
Una coda (spesso chiamata anche queue) è una sequenza di elementi di un determinato tipo, in cui gli elementi si aggiungono da un lato (tail) e si tolgono dall’altro lato (head). Questo significa che la sequenza viene gestita con la modalità detta FIFO (First-in-first-out) cioè il primo elemento inserito nella sequenza sarà il primo ad essere eliminato. La coda è una struttura dati lineare a dimensione variabile in cui si può accedere direttamente solo alla testa (head) della lista. Non è possibile accedere ad un elemento diverso da head, se non dopo aver eliminato tutti gli elementi che lo precedono (cioè quelli inseriti prima). Specifica sintattica: Tipo di riferimento: queue Tipi usati: item, boolean Operatori
Operatori
Implementazione semplice di queue con array: La coda è implementata come un puntatore ad una struct c_queue che contiene due elementi:
Considerazioni: Abbiamo visto due implementazioni diverse dell’ADT coda.