Implementazione Java di un ADT Primo passo definire l'interfaccia (API) dell' ADT (l'API descrive i nomi dei metodi che l'ADT supporta e come essi sono dichiarati e usati) Secondo passo scrivere il codice Java della classe che implementa i metodi dell'interfaccia associata all'ADT. http://java.com/it/download/ Strutture Dati Implementazione stack L'interfaccia public interface Stack { } public public public public public Strutture Dati int size(); boolean isEmpty(); Object top() throws EmptyStackException; void push (Object element); Object pop() throws EmptyStackException; Implementazione stack L'interfaccia in Java ≥ 5.0 (usato in questo corso) Classe parametrica public interface Stack<E> { } public public public public public int size(); boolean isEmpty(); E top() throws EmptyStackException; void push (E element); E pop() throws EmptyStackException; Tipo di dati generico sarà specificato a runtime Strutture Dati Implementazione stack con array Implementazione dell'interfaccia (variabili istanza) public class ArrayStack<E> implements Stack<E> { protected int capacity; public static final int CAPACITY = 1000; protected E S[]; protected int top = -1; ... } Strutture Dati Implementazione stack con array Implementazione dell'interfaccia (costruttori) public class ArrayStack<E> implements Stack<E> { ... public ArrayStack(int cap){ capacity = cap; S = (E[]) new Object [capacity]; } public ArrayStack(){ this(CAPACITY); } ... } Strutture Dati Implementazione stack con array Implementazione dell'interfaccia (metodi) public class ArrayStack<E> implements Stack<E> { ... public int size() { return top+1; } public boolean isEmpty() { return (top < 0); } public E top() throws EmptyStackException { if (isEmpty()) throw new EmptyStackException("Stack is empty."); return S[top]; } ... } Strutture Dati Implementazione stack con array Implementazione dell'interfaccia (metodi) public class ArrayStack<E> implements Stack<E> { ... public void push(E element) { if(size() == capacity) throw new FullStackException("Stack is full."); S[++top] = element; } public E pop() throws EmptyStackException { E element; if (isEmpty()) throw new EmptyStackException("Stack is empty."); element = S[top]; S[top--] = null; //deference S[top] for garbage collection. return element; } ... } Strutture Dati Implementazione stack con array Implementazione dell'interfaccia (eccezioni) public class EmptyStackException extends RuntimeException{ } public EmptyStackException(String err) { super (err); } public class FullStackException extends RuntimeException { public FullStackException(String err) { super (err); } } Strutture Dati Eclipse java project Creare un nuovo progetto java per tutte le implementazioni Creare un nuovo pacchetto per ciascun nuovo ADT studiato Strutture Dati Esercizio di test Stringhe palindrome Una stringa si dice palindroma quando resta identica se letta al contrario otto, adda, osso sono stringhe palindrome Scrivere un programma che usi uno stack per stabilire se una data stringa è palindroma otto o t t o Strutture Dati Altro esercizio di test Parentesi bilanciate Usare una pila per scrivere un metodo boolean isBalanced(String s) che verifichi se un'espressione (passata come stringa) ha le parentesi {, [, ( bilanciate. Esempio: la stringa "({hilo}kkkk)[jio]" è bilanciata mentre la stringa "({hilo}kkkk)[jio(kop0])" non lo è. Strutture Dati Implementazione coda L'interfaccia public interface Queue<E> { public int size(); public boolean isEmpty(); public E front() throws EmptyQueueException; public void enqueue (E element); public E dequeue() throws EmptyQueueException; } Strutture Dati Implementazione coda Implementazione dell'interfaccia public class ArrayQueue<E> implements Queue<E> { protected int capacity; public static final int CAPACITY = 1000; protected E Q[]; protected int front; protected int rear; public ArrayQueue(int cap) { capacity = cap; Q = (E[]) new Object[capacity]; } public ArrayQueue(){ this(CAPACITY); } } ... Strutture Dati Implementazione coda Implementazione dell'interfaccia public E dequeue() throws EmptyQueueException { E element; if (isEmpty()) throw new EmptyQueueException("La coda e` vuota."); element = Q[front]; Q[front] = null; front = (front + 1)% capacity; return element; } public void enqueue(E element) { if (size() == capacity - 1) throw new FullQueueException("La coda e` piena."); Q[rear] = element; rear = (rear + 1)% capacity; } ... Strutture Dati Implementazione coda Implementazione dell'interfaccia public E front() throws EmptyQueueException { if (isEmpty()) throw new EmptyQueueException("La coda e` vuota."); return Q[front]; } public boolean isEmpty() { return (front == rear); } public int size() { return (capacity - front + rear) % capacity; } } Strutture Dati Esercizio di test Problema di Flavio Giuseppe Ci sono n persone disposte in circolo in attesa di essere giustiziate. Partendo da una persona scelta a caso e procedendo in senso orario, il boia salta k − 1 persone, raggiunge la k-esima persona, la giustizia e la elimina dal gruppo. Si saltano ancora le k − 1 persone successive e si giustizia la k-esima. Le esecuzioni proseguono in questo modo, finché non rimane una sola persona, che viene graziata. Strutture Dati Esercizio di test Problema di Flavio Giuseppe n=5 k=3 Strutture Dati Esercizio di test Problema di Flavio Giuseppe n=5 k=3 2 Persona iniziale 3 1 4 5 Strutture Dati Esercizio di test Problema di Flavio Giuseppe n=5 k=3 2 Persona iniziale 3 1 4 5 Strutture Dati Esercizio di test Problema di Flavio Giuseppe n=5 k=3 2 Persona iniziale 3 1 4 5 Strutture Dati Esercizio di test Problema di Flavio Giuseppe n=5 k=3 2 Persona iniziale 3 1 4 5 Strutture Dati Esercizio di test Problema di Flavio Giuseppe n=5 k=3 2 3 fiuuu Persona iniziale 1 4 5 Strutture Dati Esercizio di test Problema di Flavio Giuseppe n=5 k=3 2 3 fiuuu Persona iniziale 1 4 5 Dati n e k, scrivere un metodo che, usando una coda, determini la posizione della persona graziata all'interno del cerchio di partenza. Strutture Dati