Le but de ce TD est d'implanter une file FIFO utilisant un tableau de façon circulaire et
de jouer un peu avec les types paramétrés.
Pour ce TP nous allons utiliser la même configuration Maven qu'habituellement.
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>fr.uge.fifo</groupId>
<artifactId>fifo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<release>21</release>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.1.2</version>
</plugin>
</plugins>
</build>
</project>
Comme précédemment, créer un projet Maven,
au niveau du premier écran, cocher
create simple project
puis passer à l'écran suivant en indiquant
Next.
Pour ce TP, le groupId est
fr.uge.fifo , l'artefactId est
fifo et
la version est
0.0.1-SNAPSHOT. Puis cliquer sur
Finish.
On souhaite écrire une structure de données pour représenter un file (
first-in first-out ou FIFO)
utilisant un tableau circulaire qui aura, au moins pour les premières questions, une taille fixée à la création.
La taille doit être d'au moins 1 case et il est impossible de stocker
null dans la file.
Les deux opérations principales sont
offer qui permet d'insérer un élément à la
fin de la file et
poll qui permet de retirer un élément en début de la file.
L'idée est d'utiliser deux indices, un correspondant à la tête (
head) de la file
pour retirer les éléments et un correspondant à la queue (
tail) de la file
pour ajouter des éléments.
Prenons un exemple avec un tableau de 4 cases.
Par défaut, la file est vide, on a
head et
tail à 0 :
head |
xx xx xx xx
tail |
Si on ajoute l'élément 42 avec
offer, on ajoute celui-ci à la fin de la liste, donc
au niveau de
tail, et on décale
tail :
head |
42 xx xx xx
tail |
Ensuite, si on ajoute respectivement 12 et 34, on obtient :
head |
42 12 34 xx
tail |
Si on retire un élément (ici 42) avec
poll, on retire l'élément à la position
head
et on décale
head :
head |
xx 12 34 xx
tail |
Enfin, si on ajoute les éléments 78 et 89, comme le tableau est vu comme un tableau
circulaire, on obtient :
head |
89 12 34 78
tail |
On peut remarquer que comme le tableau est plein,
head et
tail
ont la même valeur.
Remarquez que si
head et
tail sont égaux, on ne sait pas si le tableau est vide ou si le tableau est plein...
Il y a deux façons classiques de résoudre ce problème :
soit le tableau n'est jamais plein et on garde toujours une case libre ;
soit on ajoute un champ
size qui contient le nombre d'éléments.
Pour notre implantation, nous allons choisir la seconde solution.