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_data
et le renvoie. - La méthode
est_vide()
renvoieTrue
si la pile est vide etFalse
sinon. - La méthode
sommet()
renvoie l’élément présent au sommet de la pile, etNone
si 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_data
et le renvoie. - La méthode
est_vide()
renvoieTrue
si la file est vide etFalse
sinon. - La méthode
tête()
renvoie l’élément présent à la tête de la file, etNone
si 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:∅ → Pile
creer_pile_vide()
renvoie une pile videest_vide:Pile → Booléen
est_vide(pile)
renvoieTrue
sipile
est vide,False
sinonempiler: Pile,Élément → ∅
empiler(pile,element)
ajouteelement
à la pile piledepiler: Pile → Élément
depiler(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: ∅ → File
creer_file_vide()
renvoie une file videest_vide:File → Booléen
est_vide(file)
renvoieTrue
si file est vide,False
sinonenfiler: File, Élément → ∅
enfiler(file,element)
ajoute element dans la filefile
defiler: File → Élément
defiler(file)
renvoie l’élément au sommet de la filefile
en le retirant de la filefile
.
On considère la file
F
suivante :-------------------------------------- enfilement → "rouge" "vert" "jaune" "rouge" "jaune" → défilement. --------------------------------------
Quel sera le contenu de la pile
P
et de la fileF
après l’exécution du programme Python suivant?Créer une fonction
taille_file
qui prend en paramètre une fileF
et qui renvoie le nombre d’éléments qu’elle contient. Après appel de cette fonction la fileF
doit avoir retrouvé son état d’origine.Écrire une fonction
former_pile
qui prend en paramètre une fileF
et qui renvoie une pileP
contenant 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 pileP
ci-dessous :| "jaune" | -> sommet | "rouge" | P = | "jaune" | | "vert" | | "rouge" | -----------
Écrire une fonction
nb_elements
qui prend en paramètres une fileF
et un élémentelt
et qui renvoie le nombre de fois oùelt
est présent dans la fileF
. Après appel de cette fonction la fileF
doit avoir retrouvé son état d’origine.Écrire une fonction
verifier_contenu
qui prend en paramètres une fileF
et trois entiers:nb_rouge
,nb_vert
etnb_jaune
. Cette fonction renvoie le booléenTrue
si “rouge” apparaît au plusnb_rouge
fois dans la fileF
, “vert” apparaît au plusnb_vert
fois dans la fileF
et “jaune” apparaît au plusnb_jaune
fois dans la fileF
. Elle renvoieFalse
sinon. On pourra utiliser les fonctions précédentes.