1. 2 Ricordiamo che: La pila o stack è una struttura astratta composta da più elementi omogenei. Una pila è uno stack di dati con accessi del tipo LIFO.

Slides:



Advertisements
Presentazioni simili
1 La Standard Template Library vettori, liste, mappe, …. find, replace, reverse, sort, …. puntatori intelligenti La libreria standard STL e una libreria.
Advertisements

Tipi di dato astratti Lista, Pila, Coda, Albero.
Estendere i linguaggi: i tipi di dato astratti
Strutture dati lineari
Introduzione ad Array e Funzioni 2IC/2ID – a. s.2012/13.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
UD 3: “Le Liste” UD 4: “Pile e Code” UD 5: “Alberi e grafi”
Lez. 121 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Progettazione.
Strutture dati elementari
Algoritmi in C++ (1) da completare
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Liste.
PROGRAMMI DI RICERCA E ORDINAMENTO
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
CORSO DI PROGRAMMAZIONE II
CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione
CORSO DI PROGRAMMAZIONE II
Introduzione agli stream e alle classi
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
Le funzioni.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
Algoritmi e strutture dati
Corso di informatica Athena – Periti Informatici
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Esercizi Liste.
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Nota (rif. alla lezione precedente): Vector vs ArrayList Le classi generiche Vector e ArrayList sono sostanzialmente equivalenti, ma: I metodi.
CORSO DI PROGRAMMAZIONE II Lezione 22
Ripetizione La vera potenza dei programmi per computer risiede nella capacità di ripetere lo stesso calcolo o sequenza di istruzioni più volte, ogni volta.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Pile e Code.
Introduzione a Javascript
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
PROVA INTERCORSO MOD.B a.a RICORSIONE ESERCIZI A1.1-A1.6.
Algoritmi e Strutture Dati Strutture Dati Elementari.
Program. Mod B - Cap prof. Burattini 1. 2 Ricordiamo che: La pila o stack è una struttura astratta composta da più elementi omogenei. Una pila è.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Strutture Dati.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
1 Analisi ammortizzata Si considera il tempo richiesto per eseguire, nel caso pessimo, una intera sequenza di operazioni. Se le operazioni costose sono.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
Ordinamento dei vettori (SELECTION-SORT) Ordinamento per selezione (selection- sort) Si cerca l’elemento più piccolo e si scambia con l’elemento in posizione.
L’ordinamento per Selezione seleziona l’elemento con valore maggiore e lo scambia con il primo elemento del vettore. Tra gli N-1 elementi rimanenti viene.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
Copyright © Istituto Italiano Edizioni Atlas
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso di Algoritmi e Strutture Dati con Laboratorio Tipi di dato pila e coda.
Corso di Algoritmi e Strutture Dati con Laboratorio Java Collections Framework (II parte)
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE ABACUS Ud1Strutture dati lineariTempi -Liste semplicemente puntate 3h+3h.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

1

2 Ricordiamo che: La pila o stack è una struttura astratta composta da più elementi omogenei. Una pila è uno stack di dati con accessi del tipo LIFO (Last In First Out) per cui l’ultimo elemento inserito nello pila è anche il primo elemento che si può estrarre da esso. L’aggiunta di un elemento alla pila viene detta operazione di push, mentre la rimozione dallo pila viene detta operazione di pop. Vogliamo implementare una classe astratta chiamata pila i cui elementi sono numeri interi e la cui struttura è quella di un vettore. ESEMPIO DI UNA CLASSE PILA

3 Aggiungiamo alla struttura descritta un intero che indichi la posizione attuale dell’elemento da rimuovere. Indichiamo con items il vettore che contiene i componenti della pila (supposta omogenea), con top l’indice dell’elemento attuale, con push l’operazione di aggiungere oggetti e con pop quella di eliminarli. Prima di analizzare l’oggetto pila, osserviamo che dobbiamo necessariamente determinare il numero massimo di elementi che possiamo gestire: indichiamo con Max tale valore che rappresenterà una costante globale (ad esempio Max=100). I data-member della pila sono int top; int items[Max]; rigorosamente privati, mentre il costruttore dovrà inizialmente indicare che la pila è vuota ponendo top = -1;

4 In questo caso non è necessario un distruttore. Per usufruire della classe pila abbiamo la necessità di implementare i seguenti metodi: push che inserisce un oggetto della pila in cima; pop che elimina l’elemento dalla cima; cima che ne stampi semplicemente il valore senza eliminarlo; vuota, funzione booleana che restituisca true se la pila è vuota, false altrimenti; piena, funzione booleana che restituisca true se la pila è piena, false altrimenti; stampa, mostra a video tutti gli elementi nello stesso ordine in cui sono stati immessi.

5 #include using namespace std; const int Max=10; // CLASSE class pila { public: pila() { top=-1; } void push(int e); void pop(int &e); void cima(); bool vuota(); bool piena(); friend ostream& operator<< (ostream&, pila); private: int top; int items[Max]; };

6 push : se la pila non è piena allora, per inserire l’elemento e in cima, s’incrementa di una unità la variabile top e si pone items[top]  e; se la pila è piena si scrive “Pila piena”; pop : se la pila non è vuota allora, per eliminare l’elemento dalla cima, si restituisce prima l’elemento e posto in cima e poi si decrementa la variabile top di una unità; cima : se la pila non è vuota, stampa il valore items[top] senza eliminarlo; vuota : restituisce il valore booleano del confronto top==-1; piena: restituisce il valore booleano del confronto top==Max-1; overload di <<: stampa tutti gli elementi della pila a partire da top decrescendo fino all’indice 0.

7 // COSTRUZIONE E GESTIONE DI UNA PILA CON UN VETTORE #include using namespace std; const int Max=5; // CLASSE class pila { public: pila() { top=-1; } void push(int e); void pop(int &e); void cima(); bool vuota(); bool piena(); friend ostream& operator<< (ostream&, pila); private: int top; int items[Max]; }; void pila::push(int e) {// DEFINIZIONI METODI if (!piena()) { top++; items[top]=e; } else cout<<"Pila piena"<<endl; } void pila::pop(int& e) { if(!vuota()) { e=items[top]; top--; } else cout<<"Errore la pila è vuota"<<endl; } void pila::cima() { if(!vuota()) cout<<"elemento in cima = "<<items[top]<<endl; else cout<<"Non ci sono elementi nella pila "<<endl; } bool pila::vuota() { return (top==-1); } bool pila::piena() { return (top==Max-1); } ostream& operator<< (ostream& os, pila p) { os<<"("; for(int i=p.top; i>=0; i--) os<<p.items[i]<<" "; os<<")"<<endl; return os; }

8 #include #include"pileMat.h" // #include"pileS.h" using namespace std; // MAIN int main() { pila A; int e, scelta=-1; do { cout<<"\n MENU PILA "<<endl; cout<<"1) Inserisci elemento nella pila"<<endl; cout<<"2) Preleva elemento dalla pila"<<endl; cout<<"3) Verifica pila vuota"<<endl; cout<<"4) Verifica pila piena"<<endl; cout<<"5) Visualizza elemento della pila"<<endl; cout<<"6) Visualizza elenco della pila"<<endl; cout<<"0) ESCI"<<endl; cout<<"\n Inserisci scelta : "; cin>>scelta; switch(scelta){ { case 1: cout<<endl<<"Dammi il valore dell'elemento da inserire nella pila: (0 per finire) "; cin>>e; while (e!=0){ if (A.piena()) { cout<<"\n\a La pila e' piena !!\n"; e=0;} else { A.push(e); cout<<endl<<"Dammi il valore dell'elemento da inserire nella pila: (0 per finire) "; cin>>e; } } break; case 2: if(!A.vuota()) { A.pop(e); cout<<"\n L'elemento prelevato dalla testa alla pila e' : "<<e<<endl; } else cout<<"\n\n LA PILA e' VUOTA \a\n\n"; break;

9 #include //#include"pileMat.h" #include"pileS.h" using namespace std; // MAIN int main() { pila A; int e, scelta=-1; do { cout<<"\n MENU PILA "<<endl; cout<<"1) Inserisci elemento nella pila"<<endl; cout<<"2) Preleva elemento dalla pila"<<endl; cout<<"3) Verifica pila vuota"<<endl; cout<<"4) Verifica pila piena"<<endl; cout<<"5) Visualizza elemento della pila"<<endl; cout<<"6) Visualizza elenco della pila"<<endl; cout<<"0) ESCI"<<endl; cout<<"\n Inserisci scelta : "; cin>>scelta; switch(scelta) { case 3: if (A.vuota()) cout<<"\n\a La pila e' vuota !!\n"; else cout<<"\n La pila non e' vuota !\n"; break; case 4: if(A.piena()) cout<<"\n la pila e' piena !!"; else cout<<"\n La pila non e' piena !"; break; case 5: A.cima(); break; case 6: cout<<A; break; case 0: scelta =0; break; default: cout<<"\n\a Inserisci un numero tra 0 e 6 \n"; } } while(scelta); return 0; } pile

10 ESERCIZIO Assegnata la classe Pila avente la seguente descrizione class pila { public: pila() { top=-1; } void push(int e); void pop(int &e); void cima(); bool vuota(); bool piena(); friend ostream& operator<< (ostream&, pila); private: int top; int items[Max]; }; Scrivere un algoritmo che gestisca i dati introdotti nella pila con la strategia FIFO invece che LIFO

11

12 testa LE CODE (coda) coda testa

13 LE CODE Le operazioni fondamentali che si fanno sulle code sono: riempimento e svuotamento. Questo implica che durante lo svolgimento del programma il numero di oggetti in coda può cambiare. Dynamic data type: il numero di componenti nel Data Type cambia nel corso del programma. Dobbiamo descrivere una coda in funzione della sua testa, della sua coda, degli oggetti in coda e del loro numero in ogni istante della computazione.

14 OPERAZIONI SULLE CODE In una coda l’elemento inserito per primo viene anche estratto per primo (FIFO). In una coda, se si adopera una struttura ad array, occorrerà distinguere tra un inizio o TESTA della coda (punto di estrazione e/o cancellazione di un elemento) ed una fine o CODA della coda (punto di inserimento di un nuovo elemento). Aggiungere ed eliminare oggetti. Se Items[ ] è un array in cui si collocano gli oggetti. Testa l’indice dell’array corrispondente alla testa, Coda l’indice corrispondente alla coda e Item l’oggetto da aggiungere potremmo usare i seguenti algoritmi:

15 OPERAZIONI SULLE CODE AGGIUNGERE coda  coda+1 Items[coda]  Item InUse  InUse + 1 ELIMINARE testa  testa+1 InUse  InUse - 1 SOLUZIONE IMPROPONIBILE !!!!!!!!!!!! Ogni volta che esce un oggetto bisogna spostare in avanti di un posto tutti quelli in coda altrimenti lo spazio disponibile si esaurisce rapidamente pur essendoci posti vuoti.

16 Escono due oggetti e ne entrano tre Escono due oggetti e ne entrano due TestaCoda N°=6 TestaCoda N°=6 Testa Coda N°=7

17 Possiamo descrivere una coda in funzione della sua testa, della sua coda, degli oggetti in coda e del loro numero in ogni istante della computazione utilizzando l’espressione coda:=coda % Maxcoda + 1 (elimina elemento) testa:=testa % Maxcoda + 1 (preleva elemento) Ovviamente nel caso in cui InUse< Maxcoda possiamo adoperare entrambe le espressioni per aggiungere e levare, in caso contrario possiamo solo levare.

18 METODI coda costruttore - inizializza la coda vuota push(int &e) se la coda non è piena aggiungi oggetti altrimenti segnala errore pop(int &e) se la coda non è vuota elimina il primo oggetto altrimenti segnala errore cima() fornisce il valore del primo oggetto in coda, in mancanza segnala stampa() stampa gli oggetti in coda vuota() restituisce vero se non ci sono oggetti in coda piena() restituisce vero se la coda è piena

19 int main() { coda A; int e, scelta=-1; do { cout<<"\n MENU coda "<<endl; cout<<"1) Inserisci elemento nella coda"<<endl; cout<<"2) Preleva elemento dalla coda"<<endl; cout<<"3) Verifica coda vuota"<<endl; cout<<"4) Verifica coda piena"<<endl; cout<<"5) Visualizza elemento della coda"<<endl; cout<<"6) Visualizza elenco della coda"<<endl; cout<<"0) ESCI"<<endl; cout<<"\n Inserisci scelta : "; cin>>scelta; switch(scelta)

20 { case 1: cout >e; while (e!=0){ if (A.piena()) { cout<<"\n\a La coda e' piena !!\n"; e=0;} else { A.push(e); cout<<endl<<"Dammi il valore dell'elemento da inserire nella coda: (0 per finire) “ cin>>e; } } break; case 2: if(!A.vuota()) { A.pop(e); cout<<"\n L'elemento prelevato dalla testa della coda e' : "<<e<<endl; } else cout<<"\n\n LA coda e' VUOTA \a\n\n"; break;

21 case 3: if(A.vuota()) cout<<"\n\a La coda e' vuota !!\n"; else cout<<"\n La coda non e' vuota !\n"; break; case 4: if(A.piena()) cout<<"\n la coda e' piena !!"; else cout<<"\n La coda non e' piena !"; break; case 5: A.cima(); break; case 6: //cout<<A; A.stampa(); break; case 0: scelta =0; break; default: cout<<"\n\a Inserisci un numero tra 0 e 6 \n"; } } while(scelta); return 0; }

22 // COSTRUZIONE E GESTIONE DI UNA CODA CON UN VETTORE #include using namespace std; const int Max=4; // CLASSE class coda { public: coda() { top=0;queue=0; num=0;} void push(int &e); void pop(int &e); void cima(); bool vuota(); bool piena(); void stampa(); private: int top; int queue; int num; int items[Max]; }; void coda::pop(int &e) { if (!vuota()) { e=items[top]; num--; top=top%Max+1;//system("pause"); } else cout<<"coda vuota"<<endl; } void coda::push(int& e) { if(!piena()) { num++; items[queue]=e; queue=(queue+1)%Max; } else cout<<"Errore la coda è piena"<<endl; }

23 void coda::cima() { if(!vuota()) cout<<"elemento in cima = "<<items[top]<<endl; else cout<<"Non ci sono elementi nella coda "<<endl; } bool coda::vuota() { return (num==0); } bool coda::piena() { return (num==Max); } void coda::stampa() { if(!vuota()) for (int i=top;i<=top+num-1;i++) { cout<<items[i%Max]<<" "; } else cout<<"Non ci sono elementi nella coda "<<endl; }

24 Anche una coda può essere realizzata mediante delle liste legate. In questo caso si ha: Pnodo Coda; Pnodo AddCoda(Pnodo &Coda,Pnodo FCoda, int item); // aggiunge un nodo alla fine della lista Coda; Pnodo DeleteCoda(Pnodo &Coda, int item); // elimina un nodo alla testa della lista Coda;

25 ESERCIZIO Scrivere i prototipi e le definizioni degli operatori: MakeCoda AddCoda DeleteCoda FirstOnCoda QCount QEmpty QFull

26 ESEMPIO Dati due oggetti della classe lista (di interi) L1 ed L2,aventi la stessa lunghezza, costruire una lista L3 in cui nelle posizioni dispari siano presenti i corrispondenti presenti nelle posizioni dispari di L1, nelle posizioni pari siano presenti i corrispondenti presenti nelle posizioni pari di L2, a meno che nelle corrispondenti posizioni di L1 e L2 i due numeri non siano uguali, in tal caso porre 0 in L3 e cancellare da L1 e L2 i due numeri. (NB In L1 e L2 non appare mai lo zero). Es. L1=(3, 1, 7, 15, 21) L2=(8, 6, 7, 15, 55) L3=(3, 6, 0, 0, 55) L1=(3, 1, 21) L2=(8, 6, 55) Si hanno a disposizione le seguenti funzioni membro: class lista { int lung()// fornisce la lunghezza della lista. lista() // costruttore, inizializza a lista vuota. int estrai(int n)// ritorna il valore dell’elemento di posto n, se esiste, MAX_INT altrimenti void cancella(int n) //cancella l’elemento di posizione n se esiste. void inserisci(int n, int k) // Inserisce l’intero k nel posto ennesimo. }

27 class lista { int lung()// fornisce la lunghezza della lista. lista() // costruttore, inizializza a lista vuota. int estrai(int n)// ritorna il valore dell’elemento di posto n, se esiste, MAX_INT altrimenti void cancella(int n) //cancella l’elemento di posizione n se esiste. void inserisci(int n, int k) // Inserisce l’intero k nel posto ennesimo. } void ListaClass(lista L1,L2,L3); {int i=1,j=1; while (i<=L1.lung()) { if ((L1.estrai(i)!=L2.estrai(i))) {if (i%2=1)) {L3.inserisci(j,L1.estrai(i)); i=i+1; j=j+1; } else {L3.inserisci(j,L2.estrai(i)); i=i+1; j=j+1; } } else {L1.cancella(i); L2.cancella(i); L3.inserisci(j,0); j=j+1 } Costruire una lista L3 in cui nelle posizioni dispari siano presenti i corrispondenti presenti nelle posizioni dispari di L1, nelle posizioni pari siano presenti i corrispondenti presenti nelle posizioni pari di L2, a meno che nelle corrispondenti posizioni di L1 e L2 i due numeri non siano uguali, in tal caso porre 0 in L3 e cancellare da L1 e L2 i due numeri.

28 ESERCIZI Siano assegnate due liste astratte di interi L1 ed L2, non ordinate, per cui sono disponibili solo le seguenti funzioni-membro: class Lista { Lista() //costruttore, inizializza a lista vuota int estrai(int n) //ritorna il valore dell’elemento di posto n se esiste, MAX_INT altrimenti int lung() // fornisce la lunghezza della lista void inserisciOrdinato(int n) //inserisce in ordine crescente l’intero n nella lista void cancella(int n) // cancella l’elemento posto nella posizione n, se esiste bool primo(int n) // ritorna vero se n è primo } Costruire la lista L3, ordinata in modo crescente, che contenga tutti i numeri pari appartenenti ad L1 e non appartenenti ad L2 e tutti i numeri primi>2 appartenenti sia ad L1 che a L2. Es. L1= {12,13, 25, 44, 1, 20, 7,6,11}  L3={6,7, 12,13,20 } L2= {5,6, 15, 17, 2,13, 44, 7}

29 Dati due oggetti della classe lista (di interi) L1 ed L2,aventi la stessa lunghezza, per ogni coppia di elementi aventi lo stesso indice eliminare il più grande dalla corrispondente lista ed inserirlo in una lista ordinata L3. Si hanno a disposizione le seguenti funzioni membro: class lista { lista() // costruttore, inizializza a lista vuota. int estrai(int n)// ritorna il valore dell’elemento di posto n, se esiste, MAX_INT altrimenti void cancella(int n) //cancella l’elemento di posizione n se esiste. int lung()// fornisce la lunghezza della lista. void inserisci(int n, int k) // Inserisce l’intero k nel posto ennesimo se n è minore o uguale alla lunghezza della lista più uno. …………..} ESEMPIO: L1= (5,14,3,12)  L1=(5,3) L2=(7,11,5, 1)  L2=(11,1) ed L3= (5,7,12,14)

30 Sia data una lista circolare L (v. fig.) i cui elementi, a partire da quello in posizione k noto sono ordinati in maniera crescente e con ripetizioni, e l’elemento in posizione k non presenta ripetizioni. A partire da k scrivere una funzione ricorsiva che elimini le ripetizioni dalla lista e conti quanti sono gli elementi rimasti. Le function disponibili sono: class lista { lista() // costruttore, inizializza a lista vuota. int estrai(int n)// ritorna il valore dell’elemento di posto n, se esiste, MAX_INT altrimenti void cancella(int n) //cancella l’elemento di posizione n se esiste. …………..} Es. numero elementi=5