Implementare l'interfaccia Stack
(scrivere la classe ArrayStack) usando un array di tipo Object di
lunghezza fissata (e.g., private static final int CAPACITY = 1024;).
Se lo stack è pieno lanciare l'eccezione
StackFullException.
Testare la vostra implementazione della classe ArrayStack scrivendo un
programma TestStack che utilizzi tutti i metodi dell'interfaccia Stack.
Usando la struttura dati ArrayStack, invertire una stringa ricevuta in
input. Ad esempio, dando in input la stringa "casa" in output deve essere
fornita la stringa "asac".
In un'espressione aritmetica sono ammesse indifferentemente le parentesi
tonde "()" o le parentesi quadre "[]" purché siano annidate
correttamente. Scrivere una funzione che ricevendo in input una stringa,
restituisce true se e solo se le parentesi sono annidate correttamente.
Testare, attraverso un opportuno programma, la funzione precedente.
Esempi di istanze da provare:
(abc[bla]piripa(123[456])+++)-()
true
([ 5+3 )]
false
(5+2)-1)
false
(6+2
false
Implementare l'interfaccia Queue
(scrivere la classe ArrayQueue) usando un array di tipo Object di
lunghezza fissata (e.g., public static final int CAPACITY = 1024;).
Se la coda è piena lanciare l'eccezione
QueueFullException.
Testare la vostra implementazione della classe ArrayQueue scrivendo un
programma TestQueue che utilizzi tutti i metodi dell'interfaccia Queue.
Implementare l'interfaccia Deque
implementando la classe DLinkedDeque
(è una bozza di una sua possibile implementazione) usando una lista
doppiamente lincata formata di nodi di tipo
DLNode. Se la deque è vuota
lanciare l'eccezione
DequeEmptyException.
Testare la vostra implementazione della classe DLinkedDeque scrivendo un
programma TestDeque che utilizzi tutti i metodi dell'interfaccia Deque.
Implementare il TDA Stack usando
una coda a doppio ingresso. Cambia la complessità di tempo dei
vari metodi implementati? In caso affermativo, indicare come.
Implementare il TDA Queue usando
una coda a doppio ingresso. Cambia la complessità di tempo dei
vari metodi implementati? In caso affermativo, indicare come.
Implementare l'interfaccia Vector
(scrivere la classe ArrayVector) usando un array di tipo Object di
lunghezza fissata (e.g., private static final int CAPACITY = 1024;).
Se il Vector è pieno, lanciare l'eccezione
ArrayFullException. Se si accede
ad un rango non ammissibile lanciare l'eccezione
OutOfBoundaryException.
Testare la vostra implementazione della classe ArrayVector scrivendo un
programma TestVector che utilizzi tutti i metodi dell'interfaccia Vector.
Implementare l'interfaccia List
implementando la classe NodeList
(è una bozza di una sua possibile implementazione). Servirsi
dell'implemetazione dell'interfaccia Position fornita dalla classe
DNode. Le eccezioni da lanciare
sono indicate nell'interfaccia List.
Testare la vostra implementazione della classe NodeList scrivendo un
programma TestList che utilizzi tutti i metodi dell'interfaccia List.
Aggiungere alla classe NodeList
un costruttore che ricevuto in input un array A di oggetti inizializzi la
lista con gli elementi dell'array.
Scrivere una funzione ricorsiva per contare il numero di nodi di una lista
di tipo NodeList ricevuta in input. La funzione non deve distruggere la lista
ricevuta in input.
Aggiungere alla classe NodeList
un metodo ricorsivo "int conta()" che restituisce il numero degli elementi
contenuti nella lista.
Scrivere la funzione FondiConRipetizioni che, ricevuto come input due liste
di tipo NodeList, restituisca una lista contentente gli elementi di entrambe
le liste. Ad esempio, se L1=(1,3,5,6,8) ed L2=(4,5,9,7,8), allora
FondiConRipetizioni(L1,L2) restuisce L=(1,3,5,6,8,4,5,9,7,8).
Implementare l'interfaccia Sequence
implementando la classe NodeSequence
(è una bozza di una sua possibile implementazione) estendendo la
classe NodeList.
Testare la vostra implementazione della classe NodeSequence scrivendo un
programma TestList che utilizzi tutti i metodi dell'interfaccia Sequence.