La Struttura Dati Pila

Documenti analoghi
La Struttura Dati Lista

PILE E CODE. Pile (stack):

Esercizi Strutture dati di tipo astratto

Linguaggio C. Esercizio 1

Struttura dati astratta Coda

Compito di Fondamenti di Informatica

Tipi astratti pila e coda

in più stringhe,... ADT un tipo è caratterizzato dalle operazioni consentite su di esso: un numero è qualcosa che si può moltiplicare, sommare,...

Parametri Formali di una Funzione e Record di Attivazione

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

Fondamenti di Informatica II

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

dott. Sabrina Senatore

Il linguaggio C. Puntatori e dintorni

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Esercitazione 11. Liste semplici

Strutture Dinamiche. Fondamenti di Informatica

Concetti chiave. Struct. Variabili strutturate: il tipo struct Elementi di una struttura typedef e struct Array di strutture

Pile: implementazioni. Pile. Pile: liste /1. Pile: liste /2. Università Roma La Sapienza Corsi di Laurea Informatica/Tecnologie Informatiche

5. Quinta esercitazione autoguidata: liste semplici

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

ADT STACK (PILA) ADT STACK (PILA)

La struttura dati CODA

Sommario. Le strutture dati elementari per implementare sequenze: Vettori Liste

Laboratorio di Informatica

Hash Table. Hash Table

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Organigramma Gerarchia. (Tree) Nessuna persona può avere più di un superiore Ogni persona può essere superiore di altre

(*lista == NULL (*lista)->info >= elem) accede al campo next di *lista solo se *lista non e' NULL. */ #include <stdio.h> #include <stdlib.

Strutture dati dinamiche in C (II)

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Implementazione dell albero binario in linguaggio C++

Funzioni in Linguaggio C

Alberi ed Alberi Binari

Pile e code. ADT e strutture dati per la rappresentazione di sequenze ad accesso LIFO e FIFO

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Informatica 3. Informatica 3. LEZIONE 13: Liste doppie, pile e code. Lezione 13 - Modulo 1. Free list (2) Free list. Free list

Informatica 1. Prova di recupero 21 Settembre 2001

Allocazione dinamica della memoria

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

Algoritmi e Strutture Dati

FUNZIONI che operano su LISTE

Esercizi. La funzione swapint() primo tentativo

Gestione dinamica della memoria

Fondamenti di Informatica AA 2016/2017

La struttura dati PILA

Laboratorio di Programmazione

Strutture dati. Le liste

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

La programmazione nel linguaggio C

Liste a puntatori: un esercizio passo passo

Strutture Dati Dinamiche

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Implementazione di Liste puntate

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Prof.Ing.S.Cavalieri Puntatori e Heap in Linguaggio C. Puntatori e Heap

L'Allocazione Dinamica della Memoria nel linguaggio C

Un esempio di mutua ricorsione

Linguaggio C: PUNTATORI

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Programmazione I - Laboratorio

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

Allocazione dinamica

Rappresentazione collegata mediante puntatori di una lista

Argomenti della lezione. Introduzione agli Algoritmi e alle Strutture Dati. Lista Lineare. Lista Lineare come Tipo di Dato Astratto

Esercizi su strutture dati

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

Esercizio 1: Puntatori impiegati che sono manager

Tipi astratti di dati

Laboratorio di Informatica

Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione

Fondamenti di Informatica T. Linguaggio C: i puntatori

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Esercitazione 6. Array

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

3. Terza esercitazione autoguidata: progetto gestione voli

Puntatori a Funzioni e Callback. Massimo Benerecetti

Introduzione ai puntatori

Rappresentazione di dati

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Il linguaggio C. Notate che...

Perché il linguaggio C?

Argomenti della lezione. Tipo di dato astratto. Array. Tipo di dato Lista. Liste Implementazione di liste in Java Stack Code

Lezione 8 Struct e qsort

Liste, Pile e Code. 1. L ADT Lista. Liste Pile e Code Pag. 1/18

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Liste Doppiamente Collegate

Per semplicità eliminiamo le ripetizioni nell'albero.

Specifica: la sintassi. Specifica: la semantica. Specifica: la semantica

Esercizio 1. Esercizio 1 - Soluzione

Esercizio 1. Esercizio 2

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

I PUNTATORI E LE STRUTTURE DATI DINAMICHE. Cosimo Laneve/Ivan Lanese

Inserimento di un elemento in coda. quale va collegato quello nuovo. ultimo. *lista 8 3. aux. ultimo. *lista 8 3. aux

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Alberi e alberi binari I Un albero è un caso particolare di grafo

Transcript:

La Struttura Dati Pila La pila o stack è una particolare struttura dati in cui l'inserimento e la cancellazione sono consentite solo in una specifica posizione, chiamata cima (top) dello stack. La gestione dello stack è anche chiamata LIFO (Last In First Out), in quanto l'ultimo elemento inserito è il primo ad essere estratto; come detto l ultimo elemento inserito (che potrà essere anche estratto) occupa una posizione denominata top o cima. Sia data una pila composta dagli elementi a1, a2, a3,., an tutti omogenei (osia appartenenti allo stesso tipo di dato) e si supponga che la cima sia rappresentata dal primo elemento a1. L'inserimento di un elemento x produce la nuova pila x, a1, a2, a3,., an. La nuova cima della PILA è relativa all elemento appena inserito, ossia x. La cancellazione della cima ripristina la pila iniziale a1, a2, a3,., an. 1.Operazioni Primitive sulla Struttura Dati Pila La struttura dati Pila è caratterizzata da alcune operazioni fondamentali. Sia: s una generica pila x un generico elemento dello stesso tipo degli elementi presenti nella pila. Nel seguito il tipo degli elementi contenuti in uno stack verrà chiamato tipobasestack. Le seguenti operazioni primitive vengono definite per un ADT Pila: MakeNullStack(s). La funzione inizializza una Pila, restituendo una Pila vuota. EmptyStack(s). La funzione restituisce il valore logico vero se la Pila s è vuota. FullStack(s). La funzione restituisce il valore logico vero se la Pila s è piena. Push(s,x). Questa funzione inserisce l'elemento x nella pila s, nella posizione rappresentata dal top. Se s è la Pila a1, a2,, an, e se il top è rappresentato dall elemento a1 della lista, la funzione Push(s,x) restituisce la nuova pila x, a1, a2,, an. Pop(s). Questa funzione elimina l'elemento della pila che rappresenta la cima. Se s è la Pila a1, a2,, an e la cima è rappresentata dalla posizione del primo elemento, la funzione Pop(s) restituisce la nuova pila a2, a3,, an e la nuova cima è rappresentata dalla posizione dell'elemento a2. Top(s). La funzione restituisce l'elemento in cima alla Pila, che rimane inalterata. 1

2.Rappresentazione della Struttura Dati Pila. La realizzazione della struttura dati Pila in linguaggio C può avvenire in diversi modi, ad esempio utilizzando vettori oppure puntatori. Nel seguito verrà analizzata unicamente la realizzazione tramite puntatori. La rappresentazione con puntatori si basa sull'idea di considerare elementi allocati dinamicamente in memoria RAM (Heap), ciascuno dei quali è composto da due campi. Un campo memorizza il generico elemento della struttura dati Pila, mentre l'altro campo memorizza l indirizzo di memoria del successivo elemento. La rappresentazione collegata della pila con puntatori può essere simile a quella mostrata in figura. s a a 1 2 a a NULL n-1 n Il puntatore s contiene l indirizzo dell ultimo elemento inserito, ossia della cima. Questo elemento a sua volta punta all elemento inserito al passo precedente e così via. L elemento (an), inserito per primo, non punta a nessun altro elemento (campo puntatore NULL). L inserimento di un nuovo elemento, x, consiste semplicemente nell allocazione di un nuovo elemento in memoria Heap, che dovrà contenere x e che dovrà puntare all elemento a1, che rappresentava in precedenza la cima della Pila. La variabile s adesso punterà al nuovo elemento inserito, come visibile dalla seguente figura. s x a1 a1 an NULL L eliminazione della cima, analogamente avviene deallocando l elemento contente la cima della Pila e facendo puntare s all elemento il cui indirizzo era contentuo nell elemento di cima, come si evince dalla seguente figura. s x a1 a1 an NULL Nel caso di una pila vuota, la variabile s dovrà essere uguale a NULL, ad indicare una tale situazione. L inserimento del primo elemento in Pila, avverrà come detto prima, ossia allocando il nuovo elemento e ponendo s uguale all indirizzo dell elemento appena allocato. Tale elemento non 2

punterà a nessun altro, e dunque avrà il valore NULL nel campo relativo all indirizzo del prossimo elemento. La figura seguente mostra la condizione in cui la Pila è vuota e si inserisce il primo elemento. s=null a1 NULL Nel seguito, la rappresentazione Pila con puntatori verrà definita nel linguaggio C. Prima è necessario definire il tipo tipobasestack per rappresentare il tipo di dato di ogni singolo elemento contenuto nella pila. Ad esempio se il tipo di dato di ogni singolo elemento fosse int, l implementazione di tipobasestack risulterebbe: typedef int tipobasestack; Poi per comodità viene definito il tipo boolean: typedef short boolean; Deve a questo punto essere definito il generico elemento della struttura dati pila, tramite la definizione dello struct nodostack, che è costituito da campo info che contiene un generico elemento della pila e dal campo next che indica il successivo elemento nella pila. struct nodostack { tipobasestack info; struct nodostack *next; ; Infine deve essere definito il tipo Stack, ossia la definizione di pila che coinciderà con il puntatore all elemento di tipo struct nodostack. La sua implementazione è: typedef struct nodostack * stack; 3

Rappresentazione delle Operazioni Primitive Le operazioni sulla pila vengono così realizzate: void MakeNullStack(stack *s) { *s=null; boolean FullStack(stack s) { struct nodostack *temp; if(temp==null) return 1; free(temp); return 0; boolean EmptyStack(stack s) { return(s==null); void Push(stack *s, tipobasestack x) { temp->info=x; temp->next=*s; void Pop(stack *s) { if (!EmptyStack(*s)) { temp=(*s)->next; free (*s); tipobasestack Top(stack s) { if (!EmptyStack(s)) return(s->info); 4

3. Scrittura di un Programma di Gestione di Stack. Il seguente programma si riferisce alla gestione delle funzioni principali di una struttura dati pila tramite un menu di comandi. Il programma presuppone che ogni informazione contenuta nella pila sia uno struct tipobasestack composto dai campi: cognome, nome, età. #include<stdio.h> #include<stdlib.h> #define FFLUSH while(getchar()!='\n') #define S 15 typedef struct { char cognome[s], nome[s]; unsigned short eta; tipobasestack; void LeggiStringa(char s[],unsigned long dim){ unsigned long i=0; for (i=0; i<dim-1;i++) if ((s[i]=getchar())=='\n') break; if (i==dim-1) FFLUSH; s[i]='\0'; void LeggiElementoStack(tipobaseStack * p){ printf("\ninserisci il Cognome "); LeggiStringa(p->cognome, S); printf("\ninserisci il Nome "); LeggiStringa(p->nome, S); printf("\ninserisci l'eta' "); scanf("%hu",&p->eta); FFLUSH; void VisualizzaElementoStack(tipobaseStack x){ printf("\ncognome = %s ", x.cognome); printf("\nnome = %s ", x.nome); printf("\neta' = %d \n\n",x.eta); /*Definizione Pila */ typedef short boolean; struct nodostack { tipobasestack info; struct nodostack *next; ; typedef struct nodostack *stack; 5

void MakeNullStack(stack *s) { *s=null; boolean FullStack(stack s) { struct nodostack *temp; if(temp==null) return 1; free(temp); return 0; boolean EmptyStack(stack s) { return(s==null); void Push(stack *s, tipobasestack x) { temp->info=x; temp->next=*s; void Pop(stack *s) { if (!EmptyStack(*s)) { temp=(*s)->next; free (*s); tipobasestack Top(stack s) { if (!EmptyStack(s)) return(s->info); /*Programma di Gestione Pila */ stack archivio; short s; tipobasestack elem; int main(void) { MakeNullStack(&archivio); do { printf("\nmenu di Operazioni \n"); printf("\n1-inserimento "); printf("\n2-cancellazione "); printf("\n3-svuota Pila "); printf("\n4-ispeziona Elemento in Testa "); printf("\n5-fine "); 6

printf("\ninserisci la scelta "); scanf("%d",&s); FFLUSH; switch(s){ case 1 : if (!FullStack(archivio)) { printf("\ninserisci Elemento nello Stack "); LeggiElementoStack(&elem); Push(&archivio,elem); else printf("\n Pila Piena \n"); break; case 2 : if (EmptyStack(archivio)) printf("\n Pila Vuota \n"); else { Pop(&archivio); printf("\n Primo Elemento Estratto \n"); break; case 3 : while (!EmptyStack(archivio)) Pop(&archivio); break; case 4 : if (EmptyStack(archivio)) printf("pila Vuota \n"); else { printf("\nelemento in Cima allo Stack "); VisualizzaElementoStack(Top(archivio)); while (s<5); 7