Exercices
Chapitre 3: Structures linéaires: piles, files
1 Implémentation de la classe Pile
Créer une classe Pile qui implémente le type abstrait pile en stockant les données de la pile
dans un attribut privé _data de type list.
- L’initialisation s’effectue sans argument et affecte une liste vide à l’attribut
_data. - La méthode
empiler(élément)ajoute l’élément à la fin de l’attribut_data. - La méthode
dépiler()retire l’élément à la fin de l’attribut_dataet le renvoie. - La méthode
est_vide()renvoieTruesi la pile est vide etFalsesinon. - La méthode
sommet()renvoie l’élément présent au sommet de la pile, etNonesi la pile est vide.
Voici une série de tests à passer.
pile = Pile()
assert pile.est_vide() is True
pile.empiler(1)
assert pile.est_vide() is False
assert pile.sommet() == 1
pile.empiler(2)
assert pile.est_vide() is False
assert pile.sommet() == 2
assert pile.est_vide() is False
pile.empiler(3)
assert pile.sommet() == 3
assert pile.dépiler() == 3
while not pile.est_vide():
pile.dépiler()
assert pile.est_vide() is True
assert pile.sommet() is None
Pour aller plus loin, modifier la classe Pile afin que sommet() ne
soit plus une méthode, mais un attribut sommet. La série de tests précédents devra être modifié
en supprimant les parenthèses des appels des méthodes pile.sommet() en pile.sommet.
2 Implémentation de la classe File
Créer une classe File qui implémente le type abstrait file en stockant les données de la file
dans un attribut privé _data de type collections.deque présentée dans le cours et
dont vous pouvez consulter la documentation grâce à la fonction help().
- L’initialisation s’effectue sans argument et affecte une liste chaînée double vide à l’attribut
_data. - La méthode
enfiler(élément)ajoute l’élément à la tête de l’attribut_data. - La méthode
défiler()retire l’élément de la queue de l’attribut_dataet le renvoie. - La méthode
est_vide()renvoieTruesi la file est vide etFalsesinon. - La méthode
tête()renvoie l’élément présent à la tête de la file, etNonesi la file est vide.
Voici une série de tests à passer.
file = File()
assert file.est_vide() is True
file.enfiler(1)
assert file.est_vide() is False
assert file.tête() == 1
file.enfiler(2)
assert file.est_vide() is False
assert file.tête() == 1
assert file.est_vide() is False
file.enfiler(3)
assert file.tête() == 1
assert file.est_vide() is False
assert file.défiler() == 1
assert file.défiler() == 2
assert file.défiler() == 3
assert file.est_vide() is True
assert file.tête() is None
Pour aller plus loin, modifier la classe File afin que tête() ne
soit plus une méthode, mais un attribut tête. La série de tests précédents devra être modifié en
supprimant les parenthèses des appels des méthodes file.tête() en file.tête.
3 Exercice type BAC
Cet exercice porte sur la notion de pile, de file et sur la programmation de base en Python.
Il est extrait du BAC 2021 Amérique du Nord sujet 1 Exercice 5.
Les interfaces des structures de données abstraites Pile et File sont proposées
ci-dessous. On utilisera uniquement les fonctions ci-dessous :
Structure de données abstraite: Pile
Utilise: Élément, Booléen
Opérations:
-
creer_pile_vide:∅ → Pilecreer_pile_vide()renvoie une pile vide -
est_vide:Pile → Booléenest_vide(pile)renvoieTruesipileest vide,Falsesinon -
empiler: Pile,Élément → ∅empiler(pile,element)ajouteelementà la pile pile -
depiler: Pile → Élémentdepiler(pile)renvoie l’élément au sommet de la pile en le retirant de lapile
Structure de données abstraite: File
Utilise: Élément, Booléen
Opérations:
-
creer_file_vide: ∅ → Filecreer_file_vide()renvoie une file vide -
est_vide:File → Booléenest_vide(file)renvoieTruesi file est vide,Falsesinon -
enfiler: File, Élément → ∅enfiler(file,element)ajoute element dans la filefile -
defiler: File → Élémentdefiler(file)renvoie l’élément au sommet de la filefileen le retirant de la filefile.
-
On considère la file
Fsuivante :-------------------------------------- enfilement → "rouge" "vert" "jaune" "rouge" "jaune" → défilement. --------------------------------------Quel sera le contenu de la pile
Pet de la fileFaprès l’exécution du programme Python suivant? -
Créer une fonction
taille_filequi prend en paramètre une fileFet qui renvoie le nombre d’éléments qu’elle contient. Après appel de cette fonction la fileFdoit avoir retrouvé son état d’origine. -
Écrire une fonction
former_pilequi prend en paramètre une fileFet qui renvoie une pilePcontenant les mêmes éléments que la file.Le premier élément sorti de la file devra se trouver au sommet de la pile; le deuxième élément sorti de la file devra se trouver juste en-dessous du sommet, etc.
Exemple: si
-------------------------------------- F = "rouge" "vert" "jaune" "rouge" "jaune" --------------------------------------alors l’appel
former_pile(F)va renvoyer la pilePci-dessous :| "jaune" | -> sommet | "rouge" | P = | "jaune" | | "vert" | | "rouge" | ----------- -
Écrire une fonction
nb_elementsqui prend en paramètres une fileFet un élémenteltet qui renvoie le nombre de fois oùeltest présent dans la fileF. Après appel de cette fonction la fileFdoit avoir retrouvé son état d’origine. -
Écrire une fonction
verifier_contenuqui prend en paramètres une fileFet trois entiers:nb_rouge,nb_vertetnb_jaune. Cette fonction renvoie le booléenTruesi “rouge” apparaît au plusnb_rougefois dans la fileF, “vert” apparaît au plusnb_vertfois dans la fileFet “jaune” apparaît au plusnb_jaunefois dans la fileF. Elle renvoieFalsesinon. On pourra utiliser les fonctions précédentes.