La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

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

Presentazioni simili


Presentazione sul tema: "1 Argomenti della lezione Tipi di dato astratti Strutture dati elementari Liste Implementazione di liste in Java Stack Code Esempi di applicazione."— Transcript della presentazione:

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

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

3 3 Array Memorizzazione di elementi omogenei in locazioni continue Array unidimensionali: int[] num; String[] str; Creazione: num = new int[5]; str = new String[6]; Lunghezza: num.length str.length Accesso al singolo elemento: a[0] = 100; str[1] = str[2]; Array bidimensionali: int[][] mat = new int[4][3]; for(int i = 0; i<4; i++){ mat[i][0] = i; mat[i][1] = i+1; mat[i][2] = i+2; }

4 4 Tipo di dato Lista Insieme di elementi tra i quali è definito un ordinamento totale. Numerose varianti Ammette (almeno) le operazioni seguenti: cons(elem): inserisce elem in testa alla lista cdr(): elimina l elemento in testa alla lista car(): restituisce l elemento in testa alla lista senza eliminarlo Nelle implementazioni (es. Java) sono spesso presenti altre operazioni cons(elem, i), remove(i), get(i)

5 5 Implementazione delle liste Array Si usa un array in memoria Strutture collegate Ogni elemento contiene un riferimento al successivo

6 6 Implementazione con array Occorre conoscere la dimensione max della lista Può portare a spreco di memoria Costo delle principali operazioni: cons : O(n) (caso peggiore: elemento in prima posizione) cdr : O(n), (caso peggiore: primo elemento) car : O(1) Inserimento in pos. 2 A0A0 A1A1 A2A2 A N-3 A N-2 A N-1 Elemento non usato

7 7 Implementazione con strutture collegate Efficienza cons, remove : O(i) (bisogna trovare la posizione dellelemento da inserire/rimuovere). O(1) per inserimenti/cancellazioni in prima posizione get : O(i) (posizione dellelemento cercato) A 0 A 1 A i A N Inserimento in pos. 1

8 8 Altri tipi di lista Lista doppia: consente una scansione in entrambe le direzioni Lista circolare: consente di rappresentare strutture in cui lordinamento è mod N A 0 A 1 A i A N A 0 A 1 A i A N

9 9 Liste in Java Questi ADT sono rappresentati e implementati da interfacce e classi del package java.util (in realtà strutture dati più ricche) Linterfaccia più generale è Collection Rappresenta un insieme di elementi, eventualmente replicati (multinsieme) Ammette operazioni di inserimento e cancellazione

10 10 Liste in Java/2 Interfaccia List Rappresenta una collezione ordinata di elementi Ammette duplicati Implementazioni: classi LinkedList, ArrayList e Vector

11 11 Liste in Java/3 Classe LinkedList Realizza una lista doppiamente concatenata Puntatori a inizio e fine della lista Classe ArrayList Realizza lista mediante array Dimensione puo essere variata dinamicamente.

12 12 Classe LinkedList LinkedList : realizza una lista come generica lista doppiamente concatenata. Costruttore LinkedList LinkedList(): costruttore Metodi principali: void add(Object o): inserisce alla fine della lista void addFirst(Object o): inserisce in testa alla lista Object removeFirst(): elimina allinizio della lista Object removeLast(): elimina alla fine della lista Object remove(int pos): rimuove loggetto in posizione pos Object getFirst(): restituisce il primo oggetto Object getLast(): restituisce lultimo oggetto Object get(int pos): restituisce loggetto in posizione pos Iterator iterator(): restituisce un Iterator sulla lista

13 13 Classe ArrayList Corrisponde allimplementazione con array Costruttore ArrayList ArrayList() : costruisce lista vuota Metodi principali: Simili a quelli di LinkedList Fornisce anche metodi per la modifica delle dimensioni dellarray

14 14 Iteratori Sono oggetti che implementano linterfaccia Iterator Servono a scorrere sequenzialmente oggetti di tipo Collection (quindi anche liste) Esempio:... LinkedList myList = new LinkedList();.... Iterator myIterator = myList.iterator();

15 15 Iteratori/2 myIterator permette di scorrere gli elementi di myList Metodi: Object next(): restituisce lelemento successivo della lista boolean hasNext(): vero se la lista contiene altri elementi void remove(): elimina dalla lista lelemento corrente E solamente un oggetto di ausilio per scorrere la lista Si può ovviamente scorrere la lista direttamente usando gli indici

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

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

18 18 Esempi di uso della classe Vector e dellinterfaccia Iterator Vector v = new Vector(); String st = br.readLine(); // br BufferedReader while (st != null) { v.addElement(st); st = br.readLine(); } System.out.println(); Iterator it = v.iterator(); while (it.hasNext()) System.out.println(it.next());......

19 19 Vector di tipi di dato primitivi Vector v = new Vector(); String st = br.readLine(); // br BufferedReader while (st != null) { int num = Integer.parseInt(st); v.addElement(new Integer(num)); st = br.readLine(); } System.out.println(); Iterator it = v.iterator(); while (it.hasNext()) System.out.println(it.next());

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

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

22 22 Implementazione Java con Vector public class Stack { private java.util.Vector pool= new java.util.Vector(); public Stack(){ } public Stack(int n){ pool.ensureCapacity(n) } public void clear(){ pool.clear(); } public boolean isEmpty(){ return pool.isEmpty(); } public Object topEl(){ return pool.lastElement(); } public Object pop(){ return pool.remove(pool.size()-1); } public void push(Object el){ pool.addElement(el); }

23 23 Implementazione tramite LinkedList public class LLStack { private list= new java.util.LinkedList(); public LLStack(){ } public void clear(){ list.clear(); } public boolean isEmpty(){ return list.isEmpty(); } public Object topEl(){ return list.getLast(); } public Object pop(){ return list.removeLast(); } public void push(Object el){ list.add(el); } public String toString(){ return list.toString(); } Attenzione: java.util.Stack non realizza una vera pila (ci sono operazioni in più)

24 24 Implementazione tramite java.util.Stack Stack Stack(): Crea una pila vuota boolean empty(): restituisce true se la pila è vuota Object peek(): realizza l'operazione topEl() Object pop(): rimuove e restituisce l'elemento affiorante Object push(el): inserisce l'elemento specificato in cima alla pila int search(el):restituisce la posizione di el all'interno della pila

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

26 26 Implementazione di code con array A0A0 A1A1 A2A2 A N-3 A N-2 A N-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)

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

28 Algoritmi e strutture dati28 Implementazione di coda con Array circolare/2 public ArrayQueue(){ this(DEFAULTSIZE); } public ArrayQueue(int n){ size = n; storage = new Object[size]; first = last = -1; } public boolean isFull(){ return ((first == 0) && (last == size - 1)) || (first == last + 1); } public boolean isEmpty(){ return first == -1; }

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

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

31 31 Implementazione di coda con Array circolare/5 public void printAll(){ if(isEmtpy()) 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 ArrayQueue

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

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

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

35 35 Implementazione di una coda con lista concatenata/4 public Object dequeue() {// cancella il nodo in // testa e restituisce il campo info if (!isEmpty()) { 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

36 36 Riconoscimento di stringhe parenteticamente corrette La stringa vuota è parenteticamente corretta 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 Es.: ab(ax)[(b)du{(mb)}] è corretta a(ax)[c e a){b(e} non sono corrette

37 37 Algoritmo (solo un tipo di parentesi) Algorithm stringAnalyzer balanced = true; S = c = count = 0; while ((! ) && (count >= 0)) { if (c == () count++; else if (c == )) count--; c = } 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

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


Scaricare ppt "1 Argomenti della lezione Tipi di dato astratti Strutture dati elementari Liste Implementazione di liste in Java Stack Code Esempi di applicazione."

Presentazioni simili


Annunci Google