Argomenti della lezione r Tipi di dato astratti

  • Slides: 30
Download presentation
Argomenti della lezione r Tipi di dato astratti r Strutture dati elementari r Liste

Argomenti della lezione r Tipi di dato astratti r Strutture dati elementari r Liste o Implementazione di liste in Java r Stack r Code r Esempi di applicazione 1

Tipo di dato astratto r Tipo di dato astratto o ADT (Abstract Data Type):

Tipo di dato astratto r Tipo di dato astratto o ADT (Abstract Data Type): insieme di oggetti e insieme di operazioni definite su di esso r Es. : lista con operazioni di inserimento e cancellazione r Attenzione: l’ADT specifica cosa fa ogni operazione, non come r In Java: o Rappresentazione con interfaccia o Implementazione con classe 2

Liste in Java/2 r Interfaccia List r Rappresenta una collezione ordinata di elementi r

Liste in Java/2 r Interfaccia List r Rappresenta una collezione ordinata di elementi r Ammette duplicati r Implementazioni: classi Linked. List, Array. List e Vector 10

Liste in Java/3 Classe Linked. List r Realizza una lista doppiamente concatenata r Puntatori

Liste in Java/3 Classe Linked. List r Realizza una lista doppiamente concatenata r Puntatori a inizio e fine della lista Classe Array. List r Realizza lista mediante array r Dimensione puo’ essere variata dinamicamente. 11

Classe Linked. List r Linked. List: realizza una lista come generica lista doppiamente concatenata.

Classe Linked. List r Linked. List: realizza una lista come generica lista doppiamente concatenata. r Costruttore m Linked. List(): costruttore r Metodi principali: m void add(Object o): inserisce alla fine della lista m void add. First(Object o): inserisce in testa alla lista m Object remove. First(): elimina all’inizio della lista m Object remove. Last(): elimina alla fine della lista m Object remove(int pos): rimuove l’oggetto in posizione pos m Object get. First(): restituisce il primo oggetto m Object get. Last(): restituisce l’ultimo oggetto m Object get(int pos): restituisce l’oggetto in posizione pos m Iterator iterator(): restituisce un Iterator sulla lista 12

Classe Array. List r Corrisponde all’implementazione con array r Costruttore m Array. List(): costruisce

Classe Array. List r Corrisponde all’implementazione con array r Costruttore m Array. List(): costruisce lista vuota r Metodi principali: m Simili a quelli di Linked. List m Fornisce anche metodi per la modifica delle dimensioni dell’array 13

Iteratori r Sono oggetti che implementano l’interfaccia Iterator r Servono a scorrere sequenzialmente oggetti

Iteratori r Sono oggetti che implementano l’interfaccia Iterator r Servono a scorrere sequenzialmente oggetti di tipo Collection (quindi anche liste) r Esempio: . . . Linked. List my. List = new Linked. List(); . . my. Iterator = my. List. iterator(); 14

Iteratori/2 r my. Iterator permette di scorrere gli elementi di my. List r Metodi:

Iteratori/2 r my. Iterator permette di scorrere gli elementi di my. List r Metodi: m Object next(): restituisce l’elemento successivo della lista m boolean has. Next(): vero se la lista contiene altri elementi m void remove(): elimina dalla lista l’elemento corrente r E’ solamente un oggetto di ausilio per scorrere la lista r Si può ovviamente scorrere la lista direttamente usando gli indici 15

Classe Vector r E’ simile ad Array. List r I metodi sono simili a

Classe Vector r E’ simile ad Array. List r I metodi sono simili a quelli di Array. List r E’ una classe sincronizzata m E’ consigliabile usarla quando più thread che accedono alla stessa struttura dati 16

Classe Vector/2 Array: r Possono contenere tipi di dati primitivi r Dimensione fissa r

Classe Vector/2 Array: r Possono contenere tipi di dati primitivi r Dimensione fissa r Pochi metodi ma maggiore efficienza Classe Vector r Contiene Object. I tipi di dati primitivi devono essere convertiti mediante gli opportuni wrapper. r Gestione flessibile dello spazio di memoria. r Gran numero di metodi a scapito dell'efficienza 17

Esempi di uso della classe Vector e dell’interfaccia Iterator. . . Vector v =

Esempi di uso della classe Vector e dell’interfaccia Iterator. . . Vector v = new Vector(); String st = br. read. Line(); // br Buffered. Reader while (st != null) { v. add. Element(st); st = br. read. Line(); } System. out. println(); Iterator it = v. iterator(); while (it. has. Next()) System. out. println(it. next()); . . . 18

Vector di tipi di dato primitivi. . . . Vector v = new Vector();

Vector di tipi di dato primitivi. . . . Vector v = new Vector(); String st = br. read. Line(); // br Buffered. Reader while (st != null) { int num = Integer. parse. Int(st); v. add. Element(new Integer(num)); st = br. read. Line(); } System. out. println(); Iterator it = v. iterator(); while (it. has. Next()) System. out. println(it. next()); . . . . 19

Tipo astratto Pila r Lista nella quale inserimenti e cancellazioni avvengono solo in testa

Tipo astratto Pila r Lista nella quale inserimenti e cancellazioni avvengono solo in testa (disciplina LIFO). r Operazioni sempre presenti m push(el): inserisce l'elemento specificato da el in cima alla pila m pop(): elimina l'elemento in cima alla pila m top(): restituisce l'elemento in cima alla pila senza cancellarlo dalla lista m is. Empty(): verifica se la pila è vuota r Altre operazioni m clear(): elimina tutti gli elementi dalla pila 20

Implementazione del tipo Pila r Realizzazione tramite Array Ai top = i A 1

Implementazione del tipo Pila r Realizzazione tramite Array Ai top = i A 1 A 0 r Liste: realizzazione tramite lista concatenata top Start A 0 A 1 Ai AN 21

Implementazione Java con Vector public Object top. El(){ return pool. last. Element(); } public

Implementazione Java con Vector public Object top. El(){ return pool. last. Element(); } public Object pop(){ return pool. remove(pool. size()-1); } public void push(Object el){ pool. add. Element(el); } public class Stack { private java. util. Vector pool= new java. util. Vector(); public Stack(){ } public Stack(int n){ pool. ensure. Capacity(n) } public void clear(){ pool. clear(); } public boolean is. Empty(){ return pool. is. Empty(); } } 22

Implementazione tramite Linked. List public class LLStack { private list= new java. util. Linked.

Implementazione tramite Linked. List public class LLStack { private list= new java. util. Linked. List(); public LLStack(){ } public void clear(){ list. clear(); } public boolean is. Empty(){ return list. is. Empty(); } public Object top. El(){ return list. get. Last(); } public Object pop(){ return list. remove. Last(); } public void push(Object el){ list. add(el); } public String to. String(){ return list. to. String(); } } Attenzione: java. util. Stack non realizza una vera pila (ci sono operazioni in più) 23

Tipo astratto coda r Lista nella quale gli inserimenti avvengono in coda e le

Tipo astratto coda r Lista nella quale gli inserimenti avvengono in coda e le cancellazioni (estrazioni) in testa (disciplina FIFO) r Operazioni sempre presenti m is. Empty(): verifica se la coda è vuota m enqueue(el): inserisce l'elemento specificato da el alla fine della coda m dequeue(): elimina il primo elemento della coda m first. El(): restituisce il primo elemento della coda senza eliminarlo r Altre operazioni m clear(): elimina tutti gli elementi dalla coda 25

Implementazione di code con array A 0 A 1 A 2 AN-3 AN-2 AN-1

Implementazione di code con array A 0 A 1 A 2 AN-3 AN-2 AN-1 testa coda Elemento non usato enqueue -> coda = coda + 1 (mod N) dequeue -> testa = testa + 1 (mod N) Se (coda == testa – 1 mod N) coda piena Se (coda == testa) coda vuota (un solo elemento presente) 26

Implementazione di coda con Array circolare r first: r last: r size: indice del

Implementazione di coda con Array circolare r first: r last: r size: indice del primo elemento - testa indice dell'ultimo - coda numero di elementi dell'array public class Array. Queue { private int first, last, size; private Object[] storage; private static final int DEFAULTSIZE = 100; // metodi nella prossima slide 27

Implementazione di coda con Array circolare/2 public Array. Queue(){ this(DEFAULTSIZE); } public Array. Queue(int

Implementazione di coda con Array circolare/2 public Array. Queue(){ this(DEFAULTSIZE); } public Array. Queue(int n){ size = n; storage = new Object[size]; first = last = -1; } public boolean is. Full(){ return ((first == 0) && (last == size - 1)) || (first == last + 1); } public boolean is. Empty(){ Algoritmi e strutture dati 28

Implementazione di coda con Array circolare/3 public void enqueue(Object el){ if(!is. Full()) if ((last

Implementazione di coda con Array circolare/3 public void enqueue(Object el){ if(!is. Full()) if ((last == size - 1) || (last == -1)) { storage[0] = el; last = 0; if (first == -1) //caso coda vuota first=0; } else storage[++last] = el; } 29

Implementazione di coda con Array circolare/4 public Object dequeue(){ Object tmp = null; if(!is.

Implementazione di coda con Array circolare/4 public Object dequeue(){ Object tmp = null; if(!is. Empty()) { tmp = storage[first]; if (first == last) //caso unico elemento last = first = -1; else if (first == size - 1) first = 0; else first++; } return tmp; } 30

Implementazione di coda con Array circolare/5 public void print. All(){ if(is. Emtpy()) System. out.

Implementazione di coda con Array circolare/5 public void print. All(){ if(is. Emtpy()) System. out. println("Coda vuota. "); else { int i = first; do { System. out. print(storage[i] + " "); i = (i + 1) % size; } while(i != ((last + 1) % size)); System. out. println(); } } } // fine classe Array. Queue 31

Implementazione di una coda con lista concatenata public class Queue. Node { protected Object

Implementazione di una coda con lista concatenata public class Queue. Node { protected Object info; protected Queue. Node next = null; public Queue. Node(Object el) { info = el; } } public class Queue { private Queue. Node head, tail; public Queue() { head = tail = null; } 32

Implementazione di una coda con lista concatenata/2 public boolean is. Empty() { return head

Implementazione di una coda con lista concatenata/2 public boolean is. Empty() { return head == null; } public void clear() { head = tail = null; } public Object first. El() { return head. info; } 33

Implementazione di una coda con lista concatenata/3 public void enqueue(Object el) { Queue. Node

Implementazione di una coda con lista concatenata/3 public void enqueue(Object el) { Queue. Node q = new Queue. Node(el); if (!is. Empty()) { tail. next = q; tail = tail. next; } else head = tail = q; } 34

Implementazione di una coda con lista concatenata/4 public Object dequeue() {// cancella il nodo

Implementazione di una coda con lista concatenata/4 public Object dequeue() {// cancella il nodo in // testa e restituisce il campo info if (!is. Empty()) { Object el = head. info; if (head == tail) // un solo nodo? head = tail = null; else head = head. next; return el; } else return null; } // fine metodo dequeue } // fine classe Queue 35

Riconoscimento di stringhe parenteticamente corrette r La stringa vuota è parenteticamente corretta r Se

Riconoscimento di stringhe parenteticamente corrette r La stringa vuota è parenteticamente corretta r Se P 1, P 2 e P 3 sono corrette, allora lo è anche P 1(P 2)P 3, P 1[P 2]P 3 o P 1{P 2}P 3 r Es. : m ab(ax)[(b)du{(mb)}] è corretta m a(ax)[c e a){b(e} non sono corrette 36

Algoritmo (solo un tipo di parentesi) Algorithm string. Analyzer balanced = true; S =

Algoritmo (solo un tipo di parentesi) Algorithm string. Analyzer balanced = true; S = <Leggi la stringa> c = <primo carattere di S> count = 0; while ((! <fine di S>) && (count >= 0)) { if (c == ‘(’) count++; else if (c == ‘)’) count--; c = <prossimo carattere di S> } if ((fine di S) && (count != 0)) balanced = false; Provare a implementare il riconoscimento con parentesi di qualunque tipo. Es. : - fg{([{ab(vc)g}kj])} è corretta - gh{(df[ghj]}gh)hj non è corretta 37

Algoritmo (caso generale) r Usa uno stack r Se arriva ‘(‘, ‘[‘ o ‘{‘

Algoritmo (caso generale) r Usa uno stack r Se arriva ‘(‘, ‘[‘ o ‘{‘ inseriscila nello stack r Se arriva ‘)‘, ‘]‘ o ‘}‘ confrontala con l’elemento affiorante m Se non corrispondono allora la stringa non è bilanciata ( ) ] [ ( r Se si esamina la stringa fino alla fine e lo stack non è vuoto la stringa non è bilanciata. Es. : (((er[]) 38