> **Thème** : Structures de données linéaires (Pile, File)
---
## Contexte
Chaque jour, vous utilisez un navigateur web (Chrome, Firefox, Safari...). Avez-vous déjà remarqué comment fonctionnent les boutons **← Retour** et **→ Suivant** ? Et comment Netflix gère votre file d'attente "**À regarder ensuite**" ?
Dans ce TP, vous allez recréer ces mécanismes en utilisant les structures **Pile** et **File**.
---
## Partie 1 : Implémentation des structures
### Exercice 1 : La classe Pile
Implémentez une classe `Pile` avec les méthodes suivantes :
```python
classPile:
"""Structure de données LIFO (Last In First Out)."""
def__init__(self):
"""Initialise une pile vide."""
pass
defempile(self,element):
"""Ajoute un élément au sommet de la pile."""
pass
defdepile(self):
"""
Retire et renvoie l'élément au sommet.
Renvoie None si la pile est vide.
"""
pass
defest_vide(self):
"""Renvoie True si la pile est vide."""
pass
defsommet(self):
"""
Renvoie l'élément au sommet sans le retirer.
Renvoie None si la pile est vide.
"""
pass
deftaille(self):
"""Renvoie le nombre d'éléments dans la pile."""
pass
def__repr__(self):
"""Affichage de la pile."""
pass
```
**Tests à effectuer :**
```python
>>>p=Pile()
>>>p.est_vide()
True
>>>p.empile("A")
>>>p.empile("B")
>>>p.empile("C")
>>>p.sommet()
'C'
>>>p.depile()
'C'
>>>p.taille()
2
```
---
### Exercice 2 : La classe File
Implémentez une classe `File` avec les méthodes suivantes :
```python
classFile:
"""Structure de données FIFO (First In First Out)."""
def__init__(self):
"""Initialise une file vide."""
pass
defenfile(self,element):
"""Ajoute un élément en queue de file."""
pass
defdefile(self):
"""
Retire et renvoie l'élément en tête de file.
Renvoie None si la file est vide.
"""
pass
defest_vide(self):
"""Renvoie True si la file est vide."""
pass
deftete(self):
"""
Renvoie l'élément en tête sans le retirer.
Renvoie None si la file est vide.
"""
pass
deftaille(self):
"""Renvoie le nombre d'éléments dans la file."""
pass
def__repr__(self):
"""Affichage de la file."""
pass
```
**Tests à effectuer :**
```python
>>>f=File()
>>>f.est_vide()
True
>>>f.enfile("Premier")
>>>f.enfile("Deuxième")
>>>f.enfile("Troisième")
>>>f.tete()
'Premier'
>>>f.defile()
'Premier'
>>>f.taille()
2
```
---
## Partie 2 : Simulateur de navigateur web
### Principe de fonctionnement
Un navigateur utilise **deux piles** pour gérer l'historique :
- **Pile `historique`** : contient les pages visitées (la page actuelle est au sommet)
- **Pile `suivant`** : contient les pages "en avant" (après avoir cliqué sur Retour)
| Action | Effet |
|--------|-------|
| Visiter une page | Empile dans `historique`, vide `suivant` |
| Clic sur ← Retour | Dépile `historique` → empile dans `suivant` |
| Clic sur → Suivant | Dépile `suivant` → empile dans `historique` |
---
### Exercice 3 : La classe Navigateur
```python
classNavigateur:
"""Simulateur de navigateur web avec historique."""
Ajoutez une méthode pour afficher tout l'historique de navigation :
```python
defafficher_historique(self):
"""
Affiche l'historique complet de navigation.
La page actuelle est marquée d'une flèche.
"""
# À compléter
pass
```
**Exemple de sortie :**
```
Historique de navigation :
1. https://www.google.com
2. https://www.wikipedia.org
3. https://www.youtube.com
→ 4. https://www.github.com (page actuelle)
```
---
## Partie 3 : File d'attente Netflix
### Contexte
Sur Netflix, vous pouvez ajouter des films à votre liste "**À regarder**". Les films sont regardés dans l'ordre d'ajout (FIFO), mais vous pouvez aussi mettre un film en priorité.
---
### Exercice 5 : La classe ListeVisionnage
```python
classListeVisionnage:
"""Gestionnaire de file d'attente de visionnage."""
def__init__(self):
"""Initialise une liste de visionnage vide."""
self.file_attente=File()
self.historique=Pile()# Films déjà regardés
defajouter(self,titre):
"""
Ajoute un film/série à la file d'attente.
:param titre: (str) Titre du contenu à ajouter
"""
# À compléter
pass
defregarder_suivant(self):
"""
Regarde le prochain élément de la file.
- Défile le contenu
- L'ajoute à l'historique
:return: (str) Titre du contenu regardé ou None
"""
# À compléter
pass
defprochain(self):
"""
Renvoie le prochain contenu sans le retirer.
:return: (str) Titre du prochain contenu ou None
"""
# À compléter
pass
defrevoir_dernier(self):
"""
Remet le dernier contenu regardé dans la file (en tête).
Utile pour revoir un épisode.
:return: (str) Titre du contenu remis en file ou None
"""
# À compléter (utiliser une file temporaire ou une autre approche)
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International</a>.