Les files
Comme expliqué précédemment, une file travaille en mode FIFO (First In First Out). Pour être utilisée, une interface de file doit proposer a minima :
- la création d'une file vide
- l'ajout d'un élément dans la file. On dira qu'on enfile.
- le retrait d'un élément de la file et le renvoi de sa valeur. On dira qu'on défile.
La représentation la plus courante d'une file se fait horizontalement, en enfilant par la gauche et en défilant par la droite :
Utilisation d'une interface de file
Exercice 7
On considère l'enchaînement d'opérations ci-dessous. Écrire à chaque étape l'état de la file f
et la valeur éventuellement renvoyée.
Par convention, on enfilera à gauche et on défilera à droite.
```python
1. f est vide
2. f = 3
3. f = 5 3
4. val renvoyée : False
5. f = 1 5 3
6. val renvoyée : 3 , f = 1 5
7. val renvoyée : 5 , f = 1
8. f = 9 1
9. val renvoyée : 1 , f = 9
10. val renvoyée : 9 , f est vide
11. val renvoyée : True
```
Implémentation d'une file
L'objectif est de créer une classe File
, disposant des méthodes suivantes :
File()
: crée une file vide.est_vide()
: indique si la file est vide.enfile()
: insère un élément en queue de file.defile()
: renvoie la valeur de l'élément en tête de la file ET le supprime de la file.__str__()
: permet d'afficher la file sous forme agréable (par ex :|3|6|2|5|
) parprint()
Exercice
Créer la classe ci-dessus. Là encore, le type list
de Python est peut être utilisé.
Penser à aller voir ici les méthodes des objets de types list
, notamment la méthode insert
.
Remarque :
Notre implémentation répond parfaitement à l'interface qui était demandée. Mais si le «cahier des charges» obligeait à ce que les opérations enfile()
et defile()
aient lieu en temps constant (en \(O(1)\)), notre implémentation ne conviendrait pas.
En cause : notre méthode enfile()
agit en temps linéaire (\(O(n)\)) et non pas en temps constant. L'utilisation de la structure de «liste» de Python (les tableaux dynamiques) provoque, lors de l'instruction self.data.insert(0, x)
un redimensionnement de la liste. Le tableau doit être agrandi et chaque élément doit être recopié dans la case suivante. Ceci nous coûte un temps linéaire.
Implémentation d'une file avec deux piles
Comment créer une file avec 2 piles ?
L'idée est la suivante : on crée une pile d'entrée et une pile de sortie.
- quand on veut enfiler, on empile sur la pile d'entrée.
- quand on veut défiler, on dépile sur la pile de sortie.
- si celle-ci est vide, on dépile entièrement la pile d'entrée dans la pile de sortie.
Créé: January 24, 2023