Exercices listes - piles - files
Exercice 1 : 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.
La classe Pile
Il est impératif de comprendre qu'on peut choisir n'importe quelle implémentation de la classe Pile. Il suffit de connaître l'interface, Comme on ne va se servir que de cette interface, les mécanismes n'ont aucune influence sur le code de la classe File que nous ferons ensuite.
Par exemple, on choisit celle avec la liste chaînée (voir les compléments : Compléments
Exécuter absolument le code ci-dessous pour pouvoir continuer
Une file avec deux piles
Compléter le code suivant
# Tests
(insensible à la casse)(Ctrl+I)
Solution pour la méthode enfile
Solution totale
class File:
def __init__(self):
self.entree = Pile()
self.sortie = Pile()
def est_vide(self):
return self.entree.est_vide() and self.sortie.est_vide()
def enfile(self, x):
self.entree.empile(x)
def defile(self):
if self.est_vide():
print("File vide !")
return None
if self.sortie.est_vide():
while not self.entree.est_vide():
self.sortie.empile(self.entree.depile())
return self.sortie.depile()
Exercice 2⚓︎
Exercice 5 du sujet Étrangers 1 - 2021 (sujet complet en pdf)
Notion abordée : structures de données : les piles.
Dans cet exercice, on considère une pile d'entiers positifs. On suppose que les quatre fonctions suivantes ont été programmées préalablement en langage Python :
- empiler(P, e) : ajoute l'élément e sur la pile P ;
- depiler(P) : enlève le sommet de la pile P et retourne la valeur de ce sommet ;
- est_vide(P) : retourne True si la pile est vide et False sinon ;
- creer_pile() : retourne une pile vide.
Dans cet exercice, seule l'utilisation de ces quatre fonctions sur la structure de données pile est autorisée.
Q1. Recopier le schéma ci-dessous et le compléter sur votre copie en exécutant les appels de fonctions donnés. On écrira ce que renvoie la fonction utilisée dans chaque cas, et on indiquera None si la fonction ne retourne aucune valeur.
Q2. On propose la fonction ci-dessous, qui prend en argument une pile P et renvoie un couple de piles :
def transforme(P) :
Q = creer_pile()
while not est_vide(P) :
v = depile(P)
empile(Q, v)
return (P,Q)
Q3. Ecrire une fonction en langage Python maximum(P)
recevant une pile P
comme argument et qui renvoie la valeur maximale de cette pile. On ne s’interdit pas qu’après exécution de la fonction, la pile soit vide.
Q4. On souhaite connaître le nombre d’éléments d’une pile à l’aide de la fonction taille(P)
.
On s'interdit qu’après exécution de la fonction, la pile soit vide.
Correction de l'exercice 2
Python | |
---|---|
Avec le code ci-dessus, la pile p
est vide à la fin de l'exécution. Pour éviter cela, on peut par exemple créer une pile q
temporaire qui recevra les éléments de p
, avant de retransférer à la fin du programme les éléments de q
dans p
.
Q4a. On va vider la pile p
dans une pile q
tout en comptant le nombre d'éléments dépilés dans une variable t
.
On redonne ensuite à p
son état initial en vidant q
dans p
.
Q4b
Exercice 3⚓︎
Exercice 1 du sujet La Réunion J2 - 2022 (Sujet complet en pdf)
Cet exercice porte sur les structures de données (pile).
La notation polonaise inverse (NPI) permet d'écrire des expressions de calculs numériques sans utiliser de parenthèse. Cette manière de présenter les calculs a été utilisée dans des calculatrices de bureau dès la fin des années 1960. La NPI est une forme d’écriture d’expressions algébriques qui se distingue par la position relative que prennent les nombres et leurs opérations.
Par exemple :
Notation classique | Notation NPI |
---|---|
\(3+9\) | \(3 \qquad\) \(9 \qquad\) \(+\) |
\(8 \times (3+5)\) | \(8 \qquad\) \(3 \qquad\) \(5 \qquad\) \(+ \qquad\) \(\times\) |
\((17+5) \times 4\) | \(17 \qquad\) \(5 \qquad\) \(+ \qquad\) \(4 \qquad\) \(\times\) |
L’expression est lue et évaluée de la gauche vers la droite en mettant à jour une pile.
- Les nombres sont empilés dans l’ordre de la lecture.
- Dès la lecture d’un opérateur (+, -, ×, /), les deux nombres au sommet de la pile sont dépilés et remplacés par le résultat de l’opération effectuée avec ces deux nombres. Ce résultat est ensuite empilé au sommet de la pile. A la fin de la lecture, la valeur au sommet est renvoyée.
Exemple : l’expression qui correspond au calcul \(7 \times (3+25)\) s’évalue à 196 comme le montrent les états successifs de la pile créée, nommée p :
- On empile la valeur 7.
- On empile la valeur 3.
- On empile la valeur 25.
- On remplace les deux nombres du sommet de la pile (25 et 3) par leur somme 28.
- On remplace les deux nombres du sommet de la pile (28 et 7) par leur produit 196.
-
En vous inspirant de l’exemple ci-dessus, dessiner le schéma descriptif de ce que donne l’évaluation par la NPI de l’expression : \(12 \qquad\) \(4 \qquad\) \(5 \qquad\) \(\times\) \(+\)
-
On dispose de la pile suivante nommée p1 :
On rappelle ci-dessous les primitives de la structure de pile (LIFO : Last In First out) :
Fonction | Description |
---|---|
pile_vide() |
Créé et renvoie une nouvelle pile vide |
empiler(p, e) |
Place l’élément e au sommet de la pile p. |
depiler(p) |
Supprime et renvoie l’élément se trouvant au sommet de p. |
est_vide(p) |
Renvoie un booléen indiquant si p est vide ou non. |
On dispose aussi de la fonction suivante, qui prend en paramètre une pile p :
On exécute la ligne suivantetemp = top(p1)
:
a. Quelle valeur contient la variable temp après cette exécution ?
b. Représenter la pile p1 après cette exécution.
-
En utilisant uniquement les 4 primitives d’une pile, écrire en langage Python la fonction
addition(p)
qui prend en paramètre une pilep
d'au moins deux éléments et qui remplace les deux nombres du sommet d’une pilep
par leur somme.
Remarque : cette fonction ne renvoie rien, mais la pilep
est modifiée. -
On considère que l’on dispose également d’une fonction
multiplication(p)
qui remplace les deux nombres du sommet d’une pilep
par leur produit (on ne demande pas d’écrire cette fonction).
Recopier et compléter, en n’utilisant que les primitives d’une pile et les deux fonctionsaddition
etmultiplication
, la suite d’instructions (ci-dessous) qui réalise le calcul \((3+5) \times 7\) dont l’écriture en NPI est : \(3 \qquad\) \(5 \qquad\) \(+ \qquad\) \(7 \qquad\) \(\times\)
Exercice 3
Exercice 4⚓︎
Exercice 2 du sujet Métropole Candidats Libres J1 - 2021 Sujet complet en pdf
Cet exercice traite des notions de piles et de programmation orientée objet.
On crée une classe Pile qui modélise la structure d'une pile d'entiers.
Le constructeur de la classe initialise une pile vide.
La définition de cette classe sans l’implémentation de ses méthodes est donnée ci-dessous.
class Pile:
def __init__(self):
"""Initialise la pile comme une pile vide."""
def est_vide(self):
"""Renvoie True si la liste est vide, False sinon."""
def empiler(self, e):
"""Ajoute l'élément e sur le sommet de la pile, ne renvoie rien."""
def depiler(self):
"""Retire l’élément au sommet de la pile et le renvoie."""
def nb_elements(self):
"""Renvoie le nombre d'éléments de la pile. """
def afficher(self):
"""Affiche de gauche à droite les éléments de la pile, du fond de la pile vers son sommet.
Le sommet est alors l’élément affiché le plus à droite. Les éléments sont séparés par une virgule.
Si la pile est vide la méthode affiche « pile vide »."""
- a. Écrire une suite d’instructions permettant de créer une instance de la classe Pile affectée à une variable pile1 contenant les éléments 7, 5 et 2 insérés dans cet ordre.
Ainsi, à l’issue de ces instructions, l’instructionpile1.afficher()
produit l’affichage :7, 5, 2
.
b. Donner l’affichage produit après l’exécution des instructions suivantes.
- On donne la fonction mystere suivante :
def mystere(pile, element):
pile2 = Pile()
nb_elements = pile.nb_elements()
for i in range(nb_elements):
elem = pile.depiler()
pile2.empiler(elem)
if elem == element:
return pile2
return pile2
-
Cas n°1
-
Cas n°2
-
Cas n°3
-
Cas n°4
b. Expliquer ce que permet d’obtenir la fonction mystere
.
- Écrire une fonction
etendre(pile1, pile2)
qui prend en arguments deux objetsPile
appeléspile1
etpile2
et qui modifiepile1
en lui ajoutant les éléments depile2
rangés dans l'ordre inverse. Cette fonction ne renvoie rien.
On donne ci-dessous les résultats attendus pour certaines instructions.
>>>pile1.afficher()
7, 5, 2, 3
>>>pile2.afficher()
1, 3, 4
>>>etendre(pile1, pile2)
>>>pile1.afficher()
7, 5, 2, 3, 4, 3, 1
>>>pile2.est_vide()
True
supprime_toutes_occurences(pile, element)
qui prend en arguments un objet Pile
appelé pile
et un élément element
et supprime tous les éléments element
de pile
.On donne ci-dessous les résultats attendus pour certaines instructions.
>>>pile.afficher()
7, 5, 2, 3, 5
>>>supprime_toutes_occurences (pile, 5)
>>>pile.afficher()
7, 2, 3
Exercice 4
L'affichage produit est 7, 5, 5, 2
.
- Cas n°1 :
3, 2
- Cas n°2 :
3, 2, 5, 7
- Cas n°3 :
3
- Cas n°4 :
«pile vide»
La fonction mystere
permet d'obtenir la pile retournée jusqu'à un élément particulier (s'il existe).
Exercice 5⚓︎
Exercice 5 du sujet Amérique du Nord J1 - 2021 (Sujet complet en pdf)
Cet exercice porte sur la notion de pile, de file et sur la programmation de base en Python.
Les interfaces des structures de données abstraites Pile et File sont proposées ci-dessous. On utilisera uniquement les fonctions ci-dessous :
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 : ∅
\(\rightarrow\)Pile
👉creer_pile_vide()
renvoie une pile videest_vide : Pile
\(\rightarrow\) Booléen
👉est_vide(pile)
renvoieTrue
sipile
est vide,False
sinonempiler : Pile, Élément
\(\rightarrow\)∅
👉empiler(pile, element)
ajouteelement
à la pilepile
depiler : Pile
\(\rightarrow\) Élément
👉depiler(pile)
renvoie l’élément au sommet de lapile
en le retirant de lapile
Structure de données abstraite : File
Utilise : Élément, Booléen
Opérations :
creer_file_vide : ∅
\(\rightarrow\)File
👉creer_file_vide()
renvoie une file videest_vide : File
\(\rightarrow\) Booléen
👉est_vide(file)
renvoieTrue
sifile
est vide,False
sinonemfiler : File, Élément
\(\rightarrow\)∅
👉emfiler(file, element)
ajouteelement
à la filefile
defiler : File
\(\rightarrow\) Élément
👉depiler(file)
renvoie l’élément au sommet de lafile
en le retirant de la filefile
1.
a) On considère la file F
suivante :
enfilement \(\rightarrow \fbox{"rouge" "vert" "jaune" "rouge" "jaune"} \rightarrow\) défilement
Quel sera le contenu de la pile P
et de la file F
après l’exécution du programme Python suivant :
b) Créer une fonction taille_file
qui prend en paramètre une file F
et qui renvoie le nombre d’éléments qu’elle contient. Après appel de cette fonction la file F
doit avoir retrouvé son état d’origine.
2. Écrire une fonction former_pile
qui prend en paramètre une file F
et qui renvoie une pile P
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
= \(\fbox{"rouge" "vert" "jaune" "rouge" "jaune"}\)
alors l’appel former_pile(F)
va renvoyer la pile P
ci-dessous :
nb_elements
qui prend en paramètres une file F
et un élément elt
et qui renvoie le nombre de fois où elt
est présent dans la file F
.Après appel de cette fonction la file
F
doit avoir retrouvé son état d’origine.
4. Écrire une fonction verifier_contenu
qui prend en paramètres une file F
et trois entiers : nb_rouge
, nb_vert
et nb_jaune
.
Cette fonction renvoie le booléen True
si "rouge" apparaît au plus nb_rouge
fois dans la file F
, "vert" apparaît au plus nb_vert
fois dans la file F
et "jaune" apparaît au plus nb_jaune
fois dans la file F
. Elle renvoie False
sinon. On pourra utiliser les fonctions précédentes.
Exercice 5
Le contenu de la pile P sera
Exercice 6⚓︎
Exercice 2 du sujet Centres Étrangers J1 - 2022 (Sujet complet en pdf)
Cet exercice porte sur les structures de données (files et la programmation objet en langage python)
Un supermarché met en place un système de passage automatique en caisse.
Un client scanne les articles à l’aide d’un scanner de code-barres au fur et à mesure qu’il les ajoute dans son panier.
Les articles s’enregistrent alors dans une structure de données.
La structure de données utilisée est une file définie par la classe Panier, avec les primitives habituelles sur la structure de file.
Pour faciliter la lecture, le code de la classe Panier n’est pas écrit.
class Panier():
def __init__(self):
"""Initialise la file comme une file vide."""
def est_vide(self):
"""Renvoie True si la file est vide, False sinon."""
def enfiler(self, e):
"""Ajoute l'élément e en dernière position de la file, ne renvoie rien."""
def defiler(self):
"""Retire le premier élément de la file et le renvoie."""
Le panier d’un client sera représenté par une file contenant les articles scannés. Les articles sont représentés par des tuples (code_barre, designation, prix, horaire_scan)
où
code_barre
est un nombre entier identifiant l’article ;designation
est une chaine de caractères qui pourra être affichée sur le ticket de caisse ;prix
est un nombre décimal donnant le prix d’une unité de cet article ;horaire_scan
est un nombre entier de secondes permettant de connaitre l’heure où l’article a été scanné.
1. On souhaite ajouter un article dont le tuple est le suivant
(31002, "café noir", 1.50, 50525)
.
Ecrire le code utilisant une des quatre méthodes ci-dessus permettant d’ajouter l’article à l’objet de classe Panier
appelé panier1
.
2. On souhaite définir une méthode remplir(panier_temp)
dans la classe Panier permettant de remplir la file avec tout le contenu d’un autre panier panier_temp
qui est un objet de type Panier
.
Recopier et compléter le code de la méthode remplir
en remplaçant chaque ... par la primitive de file qui convient.
def remplir(self, panier_temp):
while not panier_temp. ...:
article = panier_temp. ...
self ... (article)
3. Pour que le client puisse connaitre à tout moment le montant de son panier, on souhaite ajouter une méthode prix_total()
à la classe Panier
qui renvoie la somme des prix de tous les articles présents dans le panier.
Ecrire le code de la méthode prix_total
. Attention, après l’appel de cette méthode, le panier devra toujours contenir ses articles.
4. Le magasin souhaite connaitre pour chaque client la durée des achats. Cette durée sera obtenue en faisant la différence entre le champ horaire_scan
du dernier article scanné et le champ horaire_scan
du premier article scanné dans le panier du client. Un panier vide renverra une durée égale à zéro. On pourra accepter que le panier soit vide après l’appel de cette méthode.
Ecrire une méthode duree_courses
de la classe Panier
qui renvoie cette durée.
Exercice 6
Exercice 7⚓︎
Exercice 3 du sujet Centres Etrangers J1 - 2023 (Sujet complet en pdf)
Cet exercice porte sur les structures de Files
Simon est un jeu de société électronique de forme circulaire comportant quatre grosses touches de couleurs différentes : rouge, vert, bleu et jaune.
Le jeu joue une séquence de couleurs que le joueur doit mémoriser et répéter ensuite. S’il réussit, une couleur parmi les 4 est ajoutée à la fin de la séquence. La nouvelle séquence est jouée depuis le début et le jeu continue. Dès que le joueur se trompe, la séquence est vidée et réinitialisée avec une couleur et une nouvelle partie commence.
Exemple de séquence jouée : rouge \(\rightarrow\) bleu \(\rightarrow\) rouge \(\rightarrow\) jaune \(\rightarrow\) bleu
Dans cet exercice nous essaierons de reproduire ce jeu.
Les quatre couleurs sont stockées dans un tuple nommé couleurs :
couleurs = ("bleu", "rouge", "jaune", "vert")
Pour stocker la séquence à afficher nous utiliserons une structure de file que l’on nommera sequence
tout au long de l’exercice.
La file est une structure linéaire de type FIFO (First In First Out). Nous utiliserons
durant cet exercice les fonctions suivantes :
Structure de données abstraite : File
creer_file_vide()
: renvoie une file videest_vide(f)
: renvoieTrue
sif
est vide,False
sinonenfiler(f, element)
: ajoute element en queue def
defiler(f)
: retire l'élément en tête def
et le renvoietaille(f)
: renvoie le nombre d'éléments def
En fin de chaque séquence, le Simon tire au hasard une couleur parmi les 4 proposées. On utilisera la fonction randint(a,b)
de la bibliothèque random
qui permet d’obtenir un nombre entier compris entre a
inclus et b
inclus pour le tirage aléatoire.
Exemple : randint(1,5)
peut renvoyer 1, 2, 3, 4 ou 5.
1. Recopier et compléter, sur votre copie, les des lignes 3 et 4 de la fonction
ajout(f)
qui permet de tirer au hasard une couleur et de l’ajouter à une séquence. La fonction ajout
prend en paramètre la séquence f
; elle renvoie la séquence f
modifiée (qui intègre la couleur ajoutée au format chaîne de caractères).
Python | |
---|---|
En cas d’erreur du joueur durant sa réponse, la partie reprend au début ; il faut donc vider la file sequence pour recommencer à zéro en appelant vider(sequence)
qui permet de rendre la file sequence vide sans la renvoyer.
2. Ecrire la fonction vider
qui prend en paramètre une séquence f
et la vide sans la renvoyer.
Le Simon doit afficher successivement les différentes couleurs de la séquence.
Ce rôle est confié à la fonction affich_seq(sequence)
, qui prend en paramètre la file de couleurs sequence, définie par l’algorithme suivant :
- on ajoute une nouvelle couleur à
sequence
; - on affiche les couleurs de la séquence, une par une, avec une pause de 0,5 s entre chaque affichage.
Une fonction affichage(couleur)
(dont la rédaction n’est pas demandée dans cet exercice) permettra l’affichage de la couleur souhaitée avec couleur de type chaîne de caractères correspondant à une des 4 couleurs.
La temporisation de 0,5 s sera effectuée avec la commande time.sleep(0.5)
. Après l’exécution de la fonction affich_seq
, la file sequence
ne devra pas être vidée de ses éléments.
3. Recopier et compléter, sur la copie, les ... des lignes 4 à 10 de la fonction affich_seq(sequence)
ci-dessous :
Python | |
---|---|
Nous allons ici créer une fonction tour_de_jeu(sequence)
qui gère le déroulement d’un tour quelconque de jeu côté joueur. La fonction tour_de_jeu
prend en paramètre la file de couleurs sequence
, qui contient un certain nombre de couleurs.
- Le jeu électronique Simon commence par ajouter une couleur à la séquence et affiche l’intégralité de la séquence.
- Le joueur doit reproduire la séquence dans le même ordre. Il choisit une couleur via la fonction
saisie_joueur()
. - On vérifie si cette couleur est conforme à celle de la séquence.
- S’il s’agit de la bonne couleur, on poursuit sinon on vide
sequence
. Si le joueur arrive au bout de la séquence, il valide le tour de jeu et le jeu se poursuit avec un nouveau tour de jeu, sinon le joueur a perdu et le jeu s’arrête.
La fonction tour_de_jeu
s’arrête donc si le joueur a trouvé toutes les bonnes couleurs de sequence
dans l’ordre, ou bien dès que le joueur se trompe.
Après l’exécution de la fonction tour_de_jeu
, la file sequence
ne devra pas être vidée de ses éléments en cas de victoire.
a. Afin d’obtenir la fonction tour_de_jeu(sequence)
correspondant au comportement décrit ci-dessus, recopier le script ci-dessous et
- Compléter les ...
- Choisir parmi les propositions de syntaxes suivantes lesquelles correspondent aux ZONES A, B, C, D, E et F figurant dans le script et les y remplacer (il ne faut donc en choisir que six parmi les onze) :
vider(sequence)
defiler(sequence)
enfiler(sequence,c_joueur)
enfiler(stock,c_seq)
enfiler(sequence, defiler(stock))
enfiler(stock, defiler(sequence))
affich_seq(sequence)
while not est_vide(sequence):
while not est_vide(stock):
if not est_vide(sequence):
if not est_vide(stock):
b. Proposer une modification pour que la fonction se répète si le joueur trouve toutes les couleurs de la séquence (dans ce cas, une nouvelle couleur est ajou- tée) ou s’il se trompe (dans ce cas, la séquence est vidée et se voit ajouter une nouvelle couleur). On pourra ajouter des instructions qui ne sont pas proposées dans la question a.
Exercice 7
Correction Q1.
Correction Q3.
Correction Q4.a.
Python | |
---|---|
Correction Q4.b.
Question bizarre...
ou bien
Crédits⚓︎
Auteur : Gilles Lassus
# Tests
(insensible à la casse)(Ctrl+I)