Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2



Documenti analoghi
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Algoritmi e Strutture Dati. Tipo di dato astratto e Strutture dati elementari

Il tipo di dato astratto Pila

I tipi di dato astratti

Tipi astratti di dato e loro realizzazione in Java

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

SAPIENZA Università di Roma, Facoltà di Ingegneria

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Introduzione ai tipi di dato astratti: applicazione alle liste

Realizzazione di una classe con un associazione

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Abstract Data Type (ADT)

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Algoritmi di Ricerca. Esempi di programmi Java

La struttura dati ad albero binario

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Gestione dinamica di una pila

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

obiettivi di questa seconda metà del corso fare un passo avanti rispetto a :... meccanismi di composizione dei dati

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

ARRAY E STRINGHE. G. Frosini Slide 1

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Tipi di Dato Ricorsivi

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

GESTIONE INFORMATICA DEI DATI AZIENDALI

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Corso Linguaggi di programmazione II - Unina Esercitazione (prova intercorso)

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Compito di Fondamenti di Informatica

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Tipi astratti pila e coda

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Luglio Soluzione degli Esercizi

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Java Virtual Machine

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

La fase di progetto e realizzazione. PROGETTAZIONE DEL SOFTWARE (Ing. Gestionale) Diagramma delle classi realizzativo

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

10 - Programmare con gli Array

Un esercizio d esame. Flavio De Paoli

INFORMATICA GRAFICA - FONDAMENTI DI INFORMATICA Ing. Civile - Edile/Architettura Dott. Penzo SOLUZIONE PROVA SCRITTA DEL 16/09/2002.

Definizione di classi con array di oggetti

3. La sintassi di Java

Programmazione a Oggetti Lezione 10. Ereditarieta

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Parcheggio.rtf 1/8 6 gennaio Prova di programmazione: parcheggio a pagamento

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

SAPIENZA Università di Roma, Facoltà di Ingegneria

Corso di Tecniche di Programmazione

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Esercizi Capitolo 6 - Alberi binari di ricerca

Oggetti Lezione 3. aspetti generali e definizione di classi I

Programmazione ad Oggetti: JAVA. Esercitazione

Java. Linguaggi di Programmazione Linguaggi Speciali & Tecnologie dei Linguaggi di Programmazione: Scritto del 30 Giugno 2006

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007

La fase di realizzazione. La fase di realizzazione (cont.) Traduzione in Java del diagramma degli use case

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Pile (stacks) e code (queues)

Realizzazione di Phone Plan. Soluzione - SimpleTime. Realizzazione e testing! Soluzione - SimpleTime. Soluzione - SimpleTime

Corso sul linguaggio Java

Alberi Binari Alberi Binari

Programmazione 1 A.A. 2015/2016

Sequenza alternativa degli eventi: Variazione di prezzo superiore al 20% per almeno un articolo.

Laboratorio di Algoritmi e Strutture Dati

Supermarket Progetto di Programmazione Febbraio 2010

Prova d Esame Compito A

Algoritmi e strutture dati. Codici di Huffman

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

Algoritmi e Strutture Dati

Obiettivi dell esercitazione. Requisiti (cont.) Requisiti. Università di Roma La Sapienza A.A Facoltà di Ingegneria Sede di Latina

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa E17. C. Limongelli Maggio 2012

Programmazione dinamica

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2. Dispensa E09. C. Limongelli Marzo 2008

// inizializzazione della biblioteca con utenti, libri e prestiti // non richiesta Biblioteca.inizializza();

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a I scritto Febbraio 11 Febbraio 2011

tipi di dato astratti

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Introduzione alla programmazione in C

esercizi Esercizi / problemi

PROGRAMMAZIONE AVANZATA JAVA E C. Massimiliano Redolfi. Lezione 7: Code, Stack, Liste PAJC. Ricerca. prof. Massimiliano Redolfi PAJC

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

Pila di interi. Car 1. Car n. Pila di interi: Pila di Oggetti: Gli elementi che sono inseriti e tolti dalla pila sono numeri interi

Funzioni in C. Violetta Lonati

Progettazione : Design Pattern Creazionali

Programmazione Funzionale

Esempi di esercizi d esame

Prova d Esame Compito B

Parola chiave extends

Esempio: il conto bancario

Lezione 4 Le code. Informatica. 26 Aprile Le pizze devono essere preparate e consegnate seguendo l ordine di arrivo degli ordini

APPLICAZIONI LINEARI

Transcript:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa 12 ADT: Lista, Pila, Coda A. Miola Marzo 2008 http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 1

Contenuti!Tipo astratto Lista!Realizzazione del Tipo astratto Lista!Esempi d uso della classe Lista!Tipo astratto Pila!Realizzazione del Tipo astratto Pila!Esempi d uso della classe Pila!Tipo astratto Coda!Realizzazione del Tipo astratto Coda!Esempi d uso della classe Coda http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 2

Prerequisiti!Questo capitolo presuppone la conoscenza di tutti gli argomenti trattati in precedenza nel corso e in particolare le Dispense n. 07 e n. 11 http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 3

Il Tipo astratto Lista!Il tipo astratto Lista è una tripla < S, F, C > dove " S = { Lista, V, Boolean Lista è il dominio di interesse V è il dominio di sostegno, dominio degli elementi che formano le liste " F = { listavuota, vuota, cons, car, cdr " C = { Lista_Vuota http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 4

Funzioni! listavuota : () Lista " Costruisce la lista vuota! vuota : Lista Boolean " Verifica se una lista data è vuota! cons : V x Lista Lista " Costruisce una lista inserendo un elemento di V come primo elemento di una lista data! car : Lista V " Calcola e restituisce il primo elemento di una lista data! cdr : Lista Lista " Calcola e restituisce la lista ottenuta eliminando il primo elemento di una lista data http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 5

Esempi! Supponendo di operare con liste di caratteri, che vengono rappresentate in forma parentetica, si ha!vuota( (A B C) )!vuota( () )!car ( (A B C) )!car ( () ) false true A indefinito!cdr ( (A B C) ) (B C)!cdr ( () ) indefinito!cons (A, (B C D) ) (A B C D) http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 6

Realizzazione del tipo astratto Lista! La realizzazione del tipo astratto Lista come classe Java richiede di fare delle scelte non immediate! Rappresentazione dei valori: " un modo naturale di rappresentare i valori di tipo Lista in Java è attraverso una struttura collegata " in particolare utilizziamo un campo dati nodoinit di tipo Nodo che denota l'inizio della struttura collegata! Schema realizzativo: " possiamo scegliere sia uno schema realizzativo funzionale che uno schema realizzativo con side-effect " nella realizzazione di seguito riportata scegliamo lo schema realizzativo funzionale http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 7

Realizzazione del tipo astratto Lista! Interfaccia di classe: " definiamo un metodo per ciascuna delle funzioni del tipo astratto " realizziamo la funzione listavuota attraverso un costruttore senza parametri " ridefiniamo in modo opportuno i metodi equals e tostring ereditati da Object in modo da verificare l'uguaglianza profonda degli oggetti Lista due liste sono uguali se rappresentano sequenze degli stessi elementi! Realizzazione dei metodi: " notiamo solo che nella realizzazione dei metodi facciamo uso di RuntimeException quando sono violate le precondizioni di applicabilità delle funzioni del tipo astratto (faremo questo anche negli esempi successivi) http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 8

Realizzazione del tipo astratto Lista!Il codice della classe Java Lista è il seguente, dove si è assunto che gli elementi della lista siano di tipo Object class Nodo { public Object info; public Nodo next; public class Lista { // rappresentazione degli oggetti private Nodo nodoinit; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 9

Realizzazione del tipo astratto Lista // realizzazione dei costruttori del tipo public Lista() { //realizza listavuota nodoinit = null; private Lista(Nodo n) { // costruttore privato nodoinit = n; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 10

Realizzazione del tipo astratto Lista // realizzazione delle funzioni del tipo public boolean vuota() { return nodoinit == null; public Lista cons(object o) { Nodo aux = new Nodo(); aux.info = o; aux.next = nodoinit; return new Lista(aux); http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 11

Realizzazione del tipo astratto Lista public Object car() { if (vuota()) throw new RuntimeException ("Lista: car applicato a una lista vuota"); else return nodoinit.info; public Lista cdr() { if (vuota()) throw new RuntimeException ("Lista: cdr applicato a una lista vuota"); else return new Lista(nodoinit.next); http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 12

Realizzazione del tipo astratto Lista // uguaglianza public boolean equals(object o) { boolean uguale; if (o == null!getclass().equals(o.getclass())) uguale = false; Lista l = (Lista)o; Nodo n1 = nodoinit; Nodo n2 = l.nodoinit; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 13

Realizzazione del tipo astratto Lista while (n1!= null && n2!= null) { if (!n1.info.equals(n2.info)) uguale = false; n1 = n1.next; n2 = n2.next; if (n1!= null n2!= null) uguale = false;; else uguale = true; return uguale; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 14

Realizzazione del tipo astratto Lista // tostring public String tostring() { String s; if (vuota()) s = ""; else s = car()+""+cdr().tostring(); return s; // end class Lista http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 15

Esempi di uso della classe Lista!Vediamo ora alcune operazioni non primitive che possono essere definite sulle liste realizzate come visto in precedenza!calcolo della lunghezza della lista " dato un oggetto Lista calcola la lunghezza della lista che esso rappresenta!aggiunta di un elemento in coda alla lista " dato un oggetto Lista ed un elemento da aggiungere restituisce un nuovo oggetto Lista ottenuto dal primo aggiungendo il nuovo elemento come ultimo elemento della lista http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 16

Esempi di uso della classe Lista! Concatenazione (append) di due liste " dati due oggetti Lista restituisce un nuovo oggetto Lista ottenuto concatenando le due liste " cioè restituendo una lista composta dagli elementi della prima lista e seguiti dagli elementi della seconda lista! Calcolo dell'elemento i-esimo della lista " preso un oggetto Lista e un intero i (dove i è minore della lunghezza della lista) restituisce l'elemento in posizione i! Inserimento di un nuovo elemento nella posizione i-esima " preso un oggetto Lista, un intero i (dove i è minore della lunghezza della lista) e un elemento da inserire, restituisce un nuovo oggetto Lista ottenuto dal primo aggiungendo in posizione i-esima il nuovo elemento http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 17

Esempi di uso della classe Lista!Per realizzare queste operazioni definiamo la classe ListaUso e facciamo uso della ricorsione, sfruttando il fatto che le liste sono definite induttivamente!infatti " la lista vuota è una lista " aggiungendo un elemento in testa ad una lista (mediante l operazione cons) otteniamo una lista http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 18

Calcolo della lunghezza public class ListaUso { public static int lunghezzalista(lista l) { int lun; if (l.vuota()) lun = 0; else lun = 1 + lunghezzalista(l.cdr()); return lun; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 19

Aggiunta in coda public static Lista aggiungiultimo(object o, Lista l) { Lista a; if (l.vuota()) a = l.cons(o); else a = aggiungiultimo(o,l.cdr()).cons(l.car()); return a; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 20

Append di due liste public static Lista append(lista l1, Lista l2) { Lista a; if (l1.vuota()) a = l2; else a = append(l1.cdr(),l2). cons(l1.car()); return a; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 21

Elemento in una posizione data public static Object elementoinposizione(lista l, int i) { Object o; if (l.vuota() i<0) throw new RuntimeException("ListaUso: indice fuori dai limiti"); else if (i==0) o = l.car(); else o = elementoinposizione(l.cdr(), i-1); return o; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 22

Aggiunta di un elemento in una posizione data public static Lista inseriscielementoinposizione (Lista l, int i, Object o) { Lista aux; if (i<0) throw new RuntimeException("ListaUso: indice fuori dai limiti"); else if (i==0) aux = l.cons(o); else aux = inseriscielementoinposizione (l.cdr(),i-1,o).cons(l.car()); return aux; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 23

Commento!Si noti che tutte le operazioni viste sono definite in modo indipendente dalla rappresentazione scelta per le liste, usando le operazioni pubbliche fornite dalla classe!se cambia la rappresentazione il codice delle operazioni qui definite rimane invariato http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 24

Il Tipo astratto Pila! Il tipo astratto Pila (Stack), che rappresenta sequenze di elementi di un tipo prefissato che vengono gestite con la politica LIFO (Last In First Out), ossia l'ultimo elemento entrato è il primo ad uscire, è una tripla dove " S = { Pila, V, Boolean Pila è il dominio di interesse < S, F, C > V è il dominio di sostegno, dominio degli elementi che formano la pila " F = { pilavuota, vuota, push, top, pop " C = { Pila_Vuota http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 25

Funzioni! pilavuota : () Pila " Costruisce la pila vuota! vuota : Pila Boolean " Verifica se una pila data è vuota! push : V x Pila Pila " Costruisce una pila inserendo un elemento di V come primo elemento di una pila data! top : Pila V " Calcola e restituisce il primo elemento di una pila data! pop : Pila Pila " Calcola e restituisce la pila ottenuta eliminando il primo elemento di una pila data http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 26

Realizzazione del tipo astratto Pila! La realizzazione del tipo astratto Pila come classe Java richiede di fare delle scelte non immediate! Rappresentazione dei valori: " un modo naturale di rappresentare i valori di tipo Pila in Java è attraverso una struttura collegata " in particolare utilizziamo un campo dati nodoinit di tipo Nodo che denota l'inizio della struttura collegata! Schema realizzativo: " possiamo scegliere sia uno schema realizzativo funzionale che uno schema realizzativo con side-effect " nella realizzazione di seguito riportata scegliamo lo schema realizzativo con side-effect http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 27

Realizzazione del tipo astratto Pila! Interfaccia di classe: " definiamo un metodo per ciascuna delle funzioni del tipo astratto " realizziamo la funzione pilavuota attraverso un costruttore senza parametri " ridefiniamo in modo opportuno i metodi equals e tostring ereditati da Object in modo da verificare l'uguaglianza profonda degli oggetti Pila due pile sono uguali se rappresentano la stessa sequenza di elementi! Realizzazione dei metodi: " notiamo solo che nella realizzazione dei metodi facciamo uso di RuntimeException quando sono violate le precondizioni di applicabilità delle funzioni del tipo astratto (faremo questo anche negli esempi successivi) http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 28

Realizzazione del tipo astratto Pila con side-effect!il codice della classe Java Pila è il seguente, dove si è assunto che gli elementi della pila siano di tipo Object class Nodo { public Object info; public Nodo next; public class Pila { // rappresentazione degli oggetti private Nodo nodoinit; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 29

Realizzazione del tipo astratto Pila con side-effect // realizzazione delle funzioni del tipo public Pila () { // realizza pilavuota nodoinit = null; public boolean vuota() { return nodoinit == null; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 30

Realizzazione del tipo astratto Pila con side-effect public void push (Object o) { Nodo aux = new Nodo(); aux.info = o; aux.next = nodoinit; nodoinit = aux; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 31

Realizzazione del tipo astratto Pila con side-effect public Object top() { if (vuota()) throw new RuntimeException("Pila: top applicato ad una pila vuota"); else return nodoinit.info; public void pop() { if (vuota()) throw new RuntimeException("Pila: pop applicato ad una pila vuota"); else nodoinit = nodoinit.next; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 32

Realizzazione del tipo astratto Pila con side-effect //uguaglianza public boolean equals(object o) { boolean uguale; if (o == null!getclass().equals(o.getclass())) uguale = false; Pila p = (Pila)o; Nodo n1 = nodoinit; Nodo n2 = p.nodoinit; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 33

Realizzazione del tipo astratto Pila con side-effect while (n1!= null && n2!= null) { if (!n1.info.equals(n2.info)) uguale = false; n1 = n1.next; n2 = n2.next; if (n1!= null n2!= null) uguale = false;; else uguale = true; return uguale; // end class Pila http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 34

Realizzazione funzionale del tipo astratto Pila!Se invece scegliamo uno schema realizzativo funzionale dobbiamo modificare la realizzazione della classe Java definendo la classe PilaF come segue class Nodo { public Object info; public Nodo next; public class PilaF { // rappresentazione degli oggetti private Nodo nodoinit; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 35

Realizzazione funzionale del tipo astratto Pila // realizzazione dei costruttori del tipo public PilaF() { //realizza pilavuota nodoinit = null; private PilaF(Nodo n) { // costruttore privato nodoinit = n; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 36

Realizzazione funzionale del tipo astratto Pila // realizzazione delle funzioni del tipo public boolean vuota() { return nodoinit == null; public PilaF push(object o) { Nodo aux = new Nodo(); aux.info = o; aux.next = nodoinit; return new PilaF(aux); // uso costruttore privato http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 37

Realizzazione funzionale del tipo astratto Pila public Object top() { if (vuota()) throw new RuntimeException ( PilaF: top applicato a una pila vuota"); else return nodoinit.info; public PilaF pop() { if (vuota()) throw new RuntimeException ("PilaF: pop applicato a una pila vuota"); else return new PilaF(nodoinit.next); // uso costruttore privato http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 38

Realizzazione funzionale del tipo astratto Pila // uguaglianza public boolean equals(object o) { boolean uguale; if (o == null!getclass().equals(o.getclass())) uguale = false; PilaF l = (PilaF)o; Nodo n1 = nodoinit; Nodo n2 = l.nodoinit; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 39

Realizzazione funzionale del tipo astratto Pila while (n1!= null && n2!= null) { if (!n1.info.equals(n2.info)) uguale = false; n1 = n1.next; n2 = n2.next; if (n1!= null n2!= null) uguale = false; else uguale = true; return uguale; // end class PilaF http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 40

Il Tipo astratto Coda!Il tipo astratto Coda (Queue) rappresenta sequenze di elementi di un tipo prefissato che vengono gestite con la politica FIFO (First In First Out) " l'elemento inserito per primo è il primo ad essere eliminato!coerentemente con questa politica, i valori del tipo Coda servono a rappresentare situazioni in cui, ad esempio, si vuole simulare l'andamento ad uno sportello di servizio, in cui i clienti sono serviti secondo l'ordine di arrivo http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 41

Il Tipo astratto Coda!Il tipo astratto Coda è una tripla < S, F, C > dove " S = { Coda, V, Boolean Coda è il dominio di interesse V è il dominio di sostegno, dominio degli elementi che formano le liste " F = { codavuota, vuota, incoda, outcoda, primo " C = { Coda_Vuota http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 42

Funzioni! codavuota : () Coda " Costruisce la coda vuota! vuota : Coda Boolean " Verifica se una coda data è vuota! incoda : V x Coda Coda " Costruisce una coda inserendo un elemento di V come ultimo elemento di una coda data! outcoda : Coda Coda " Calcola e restituisce la coda ottenuta eliminando l elemento di testa di una coda data (il primo elemento inserito)! primo : Coda V " Calcola e restituisce l elemento di testa di una coda data (il primo elemento inserito) http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 43

Realizzazione del tipo astratto Coda!La realizzazione del tipo astratto Coda come classe Java richiede di fare delle scelte non immediate!rappresentazione dei valori: " un modo naturale di rappresentare i valori di tipo Coda in Java è attraverso una struttura collegata " per rendere semplice l'inserimento in coda alla struttura stessa dobbiamo fare uso di un riferimento addizionale all'ultimo elemento della struttura collegata " utilizziamo due campi dati nodotesta e nodocoda di tipo Nodo che denotano rispettivamente il primo e l'ultimo elemento della struttura collegata http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 44

Realizzazione del tipo astratto Coda! Schema realizzativo: " possiamo scegliere sia uno schema realizzativo funzionale che uno schema realizzativo con side-effect " scegliamo lo schema realizzativo con side-effect! Interfaccia di classe: " definiamo un metodo per ciascuna delle funzioni del tipo astratto " realizziamo la funzione codavuota attraverso un costruttore senza parametri " ridefiniamo in modo opportuno il metodo equals ereditato da Object in modo da verificare l'uguaglianza profonda degli oggetti Coda due code sono uguali se rappresentano la stessa sequenza di elementi http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 45

Realizzazione del tipo astratto Coda class Nodo { public Object info; public Nodo next; public class Coda { //rappresentazione degli oggetti private Nodo nodotesta; private Nodo nodocoda; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 46

Realizzazione del tipo astratto Coda //realizzazione delle funzioni del tipo public Coda() { // realizza codavuota nodotesta = null; nodocoda = null; public boolean vuota() { return nodotesta == null; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 47

Realizzazione del tipo astratto Coda public void incoda(object o) { Nodo aux = new Nodo(); aux.info = o; aux.next = null; if (nodotesta == null) { nodotesta = aux; nodocoda = aux; else { nodocoda.next = aux; nodocoda = aux; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 48

Realizzazione del tipo astratto Coda public void outcoda() { if (vuota()) throw new RuntimeException("Coda: outcoda applicato else { ad una coda vuota"); nodotesta = nodotesta.next; if (nodotesta == null) nodocoda = null; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 49

Realizzazione del tipo astratto Coda public Object primo() { if (vuota()) throw new RuntimeException("Coda: primo applicato ad una coda vuota"); else return nodotesta.info; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 50

Realizzazione del tipo astratto Coda //uguaglianza public boolean equals(object o) { boolean uguali; if (o == null!getclass().equals(o.getclass())) uguali = false; Coda c = (Coda)o; Nodo n1 = nodotesta; Nodo n2 = c.nodotesta; http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 51

Realizzazione del tipo astratto Coda while (n1!= null && n2!= null) { if (!n1.info.equals(n2.info)) uguali = false; n1 = n1.next; n2 = n2.next; if (n1!= null n2!= null) uguali = false; else uguali = true; return uguali; // end class Coda http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 52