Votre opinion sur le cours de ce matin : | Votre opinion sur le TD de la semaine dernière : |
L'objectif de ce TD est d'implémenter de plusieurs façon différentes (mais toujours en Java) des files d'entiers, autrement dit des classes qui offrent les méthodes décrites ci-dessous.
size
renvoie le nombre d'éléments de la fileput
insère un nouvel élément en fin de file. Lance
l'exception FullQueueException
si la file est pleine.get
supprime et renvoie l'élément situé en tête de file.
Lance l'exception EmptyQueueException
si la file est
vide.is_empty
renvoie true
si et
seulement si la file est vide.flush
vide la file.print
affiche les entiers contenus dans la file sur une même ligne, séparés par des espaces, du plus ancien au plus récent.
Les classes et interfaces du TD seront rangées dans deux paquets
intfifo
et applications
, exceptée la classe
Main
avec laquelle on effectuera les tests
(à mettre dans le default package
de Java).
intfifo
.FIFO
dans le paquet intfifo
.
FIFO
les méthodes décrites en haut de la page. public int size () ;
déclare la méthode size
. FIFO
, nous allons préciser lesquelles au moyen de la syntaxe:
déclaration throws exception ;
où
déclaration
est une déclaration de méthode standard sans le point-virgule final, etexception
est une classe qui étend
la classe Exception
de Java.intfifo
les classes publiques
EmptyQueueException
et FullQueueException
qui étendent la classe Exception
de Java, puisFIFO
quelles sont les méthodes susceptibles de lever les
exceptions EmptyQueueException
et FullQueueException
au moyen de la syntaxe décrite précédemment.Déposer le fichier FIFO.java :
Solution :FIFO
But : écrire une classe ArrayQueue
qui implémente
l'interface FIFO
à l'aide d'un tableau d'entiers de type int []
.
Quelques indications et une contrainte :
older
et size
qui indiquent respectivement la position de
l'élément le plus ancien de la file (donc celui qui devra être
supprimé lors du prochain appel à la méthode get
) et
le nombre d'éléments contenus dans la
file. Main
. Il faut pour cela « décommenter » les lignes que
vous souhaitez activer. Déposer le fichier ArrayQueue.java :
Solution :
ArrayQueue
Map
de Java) qui associe à chaque
sommet l'ensemble (i.e. interface Set
de Java)
de ses successeurs. FIFO
pour implémenter le parcours de graphe en largeur depuis
un sommet donné.
applications
.
applications
et à l'aide des interfaces
(paramétrées) Map<K,V>
et
Set<E>
, créer l'interface Graph
qui contient les méthodes ci-dessous :
successors
qui prend en argument un entier i et
renvoie l'ensemble des successeurs de i dans le graphe.addEdge
qui prend en argument deux entiers i et
j et ajoute l'arc i→j au graphe.print
qui affiche un graphe en affichant pour chaque
sommet une ligne qui indique ses successeurs.
MyGraph
qui implémente Graph
.
On ajoutera notamment deux constructeurs :
MyGraph ()
qui construit le graphe vide ;MyGraph (int [][] g)
qui prend un tableau de tableaux
d'entiers en argument et renvoie le graphe correspondant (les
éléments de la k-ème ligne sont les successeurs de k).
C'est pratique pour faire des tests.
BFS
pour réaliser le
parcours en largeur, contenant
BFS(Graph g)
prenant le
graphe à parcourir en argument ;
printReachableFrom
qui prend en argument un entier i et
affiche (sur une ligne et séparés par des espaces) les sommets du
graphe visités par un parcours en largeur partant du sommet i.
Rappel concernant le parcours en largeur :
Main
(décommenter les lignes
que vous souhaitez activer). Vous devez obtenir la sortie suivante :
0: 0 1 2 3 1: 1 3 0 2 2: 2 3 0 1 3: 3 0 1 2 4: 4 5 5: 5
Déposer les fichiers Graph.java, MyGraph.java, et BFS.java:
Solution :Graph
/
MyGraph
/
BFS
LinkedQueue
qui implémente l'interface
FIFO
à l'aide de listes chaînées.
L'utilisation de tableaux dans ArrayQueue
contraint
le programmeur à fixer une taille maximale initialement. Nous
allons lever cette contrainte en utilisant des listes chaînées.
Une file est une liste chaînée dont la tête est l'élément le plus
ancien (donc celui qui sera supprimé au prochain appel à la
méthode get
). On maintient aussi un pointeur sur la
dernière cellule de la liste chaînée, de manière à pouvoir ajouter
de nouveaux éléments à la fin de la liste.
intfifo
, ajouter une classe
ListCell
pour représenter une liste non vide,
avec deux champs
value
et next
. La valeur null
sera utilisée pour représenter la liste vide.
intfifo
une
implémentation LinkedQueue
de l'interface
FIFO
à l'aide de la classe ListCell
.
Main
(décommenter les lignes
que vous souhaitez activer).
BFS
, remplacer l'utilisation de
ArrayQueue
par LinkedQueue
. Relancer les
tests. Vous devez observer les mêmes résultats.
ArrayQueue
et LinkedQueue
,
munir la classe BFS
d'une méthode abstraite
FIFO newQueue()
et l'implémenter dans deux sous-classes
distinctes, d'un côté par return new
ArrayQueue(128)
et de l'autre par return new LinkedQueue ()
.
Déposer les fichiers ListCell.java et LinkedQueue.java :
Solution :ListCell
et
LinkedQueue