Piles, files
Vous n'utiliserez que les méthodes de la classe Pile
pour répondre aux questions des exercices.
Notation objet | Description |
---|---|
Pile() -> Pile |
Créer une pile vide |
p.est_vide() -> bool |
Détermine si la pile p est vide. |
p.empiler(c:int) -> None |
Ajoute l'entier c au sommet de la pile p |
p.depiler() -> int |
Renvoie l'entier au sommet de la pile p , lorsque cela est possible. |
print(p) -> None |
Affiche la pile p sans la modifier. |
Pile : une structure mutable¶
-
Quelle affichage produit le code :
1 2 3 4 5 6
p = Pile() p.empiler(1) p.empiler(2) p.empiler(3) p.empiler(4) print(p)
-
On définit la fonction
i
ci-dessous.1 2 3 4 5 6 7 8
def i(p): """ Pile -> Pile """ p_aux = Pile() while not p.est_vide(): e = p.depiler() p_aux.empiler(e) p = p_aux return p
Quel affichage produit le code :
1 2 3
res = i(p) print(res) print(p)
[Sommet] 1 2 3 4 [Sommet]
Moyenne¶
-
Écrire une fonction
moyenne
qui prend en argument une pilep
composée d'entiers et qui renvoie la moyenne des éléments qui la composent. On ne se souciera pas de restaurer l'état de la pile.On rappelle que si
p
est la pile constituée des éléments7, 8, 12
, alors la moyenne des éléments dep
est donnée par la formule :$\dfrac{7 + 8 + 12}{3} $
1 2 3 4 5 6 7 8 9 10 11 12 13
def moyenne(p): """ Pile -> int """ s = 0 n = 0 while not p.est_vide(): s += p.depiler() n += 1 return s/n p = Pile() p.empiler(7) p.empiler(8) p.empiler(12)
1 2
print(p) print(moyenne(p))
[Sommet] 12 8 7 9.0
-
Écrire une fonction
moyenne_ponderee
qui prend en argument une pilep
composée de couples d'entiers(note, coefficient)
et qui renvoie la moyenne pondérée associée. On ne se souciera pas de restaurer l'état de la pile.Par exemple, si la pile
p
est constituée des éléments(14, 1)
,(11, 3)
et(18, 4)
, cela veut dire que la moyenne sera composée d'une note de 14 (coefficient 1), une note de 11 (coefficient 3) et d'une note de 18 (coefficient 4).La moyenne sera obtenue a l'aide de la formule :
$\dfrac{14\times1 + 11\times 3 + 18\times 2}{1 + 3 + 2} $
1 2 3 4 5 6 7 8 9 10 11 12 13 14
def moyenne_ponderee(p): """ Pile -> int """ s = 0 n = 0 while not p.est_vide(): note, coeff = p.depiler() s += note*coeff n += coeff return s/n p = Pile() p.empiler((14,1)) p.empiler((11,3)) p.empiler((18,4))
1 2
print(p) print(moyenne_ponderee(p))
[Sommet] (18, 4) (11, 3) (14, 1) 14.875
Pile triée ?¶
-
Écrire une fonction
sommet
qui étant donné une pile d'entiersp
supposée non vide renvoie la valeur présente au sommet dep
sans modifierp
.1 2 3 4 5 6 7 8 9 10
def sommet(p): a = p.depiler() p.empiler(a) return a p = Pile() p.empiler(4) p.empiler(3) p.empiler(2) p.empiler(1)
1 2 3
print(p) print(sommet(p)) print(p)
[Sommet] 1 2 3 4 1 [Sommet] 1 2 3 4
-
Écrire une fonction
est_triee
qui étant donnée une pilep
supposée non vide, détermine si les éléments qui la composent sont rangés par ordre croissant (le plus petit élément se trouve au sommet de la pile).La pile
p
devra être dans le même état qu'initialement après exécution de l'instructionest_triee(p)
.Indications. On initialisera une pile auxiliaire vide qui servira à restaurer l'état de la pile
p
. On dépilera un premier élément dep
, que l'on stockera dans une variablea
. Puis, tant que la pilep
n'est pas vide et quea
est inférieur au sommet dep
, on dépilep
en mettant à joura
et la pile auxiliaire.Si à l'issue de ces dépilements la pile est vide c'est qu'elle était initialement triée. Sinon, c'est qu'elle n'était pas triée. Puis, on restaure l'état initial à l'aide de la pile auxiliaire.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
def est_triee(p): """ Pile -> bool """ p_aux = Pile() a = p.depiler() p_aux.empiler(a) while not p.est_vide() and a <= sommet(p): a = p.depiler() p_aux.empiler(a) res = True if p.est_vide() else False while not p_aux.est_vide(): p.empiler(p_aux.depiler()) return res p = Pile() p.empiler(4) p.empiler(3) p.empiler(3) p.empiler(2) p.empiler(1)
1 2 3
print(p) print(est_triee(p)) print(p)
[Sommet] 1 2 3 3 4 True [Sommet] 1 2 3 3 4