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