# Définition des classes class Cellule : def __init__(self , valeur = 0 , suivant = None) : self.valeur = valeur self.suivant = suivant def __str__(self) : return f" {self.valeur}" class Pile : def __init__(self,nom) : self.sommet = None self.nom = nom def est_vide(self) : return self.sommet == None def empiler(self,valeur) : nouvelle_cellule = Cellule(valeur , self.sommet) self.sommet = nouvelle_cellule def depiler(self) : if self.sommet != None : ancien_sommet = self.sommet self.sommet = ancien_sommet.suivant return ancien_sommet.valeur else : print("Liste vide") return None def affichage_contenu(self) : print(f"\nContenu de la Pile {self.nom}") if (self.sommet == None) : print(" Pile vide") else : cellule = self.sommet print(cellule) while cellule.suivant != None : cellule = cellule.suivant print(cellule) def hauteur(self) : Q = Pile("Q") n = 0 while not self.est_vide() : n += 1 x = self.depiler() Q.empiler(x) while not Q.est_vide() : x = Q.depiler() P.empiler(x) return n def max_pile(self,i) : if self.est_vide() : return None Q = Pile("Q") taille = self.hauteur() if i > taille : i = taille n = 1 x = self.depiler() Q.empiler(x) max = int(x) indice_max = n while n < i : x = self.depiler() Q.empiler(x) n += 1 if int(x) > max : max = int(x) indice_max = n while not Q.est_vide() : x = Q.depiler() P.empiler(x) return indice_max def retourner(self , j) : # création piles auxiliaires Q1 = Pile("Q1") Q2 = Pile("Q2") # cas particuliers if self.est_vide() : print("Impossible de retourner - Pile vide") taille = self.hauteur() if taille == 1 or j <= 1 : return if j > taille : j = taille # opération de retournement for i in range(1, j+1) : Q1.empiler(P.depiler()) while not Q1.est_vide() : Q2.empiler(Q1.depiler()) while not Q2.est_vide() : self.empiler(Q2.depiler()) # Main - Question 3 - Sujet 0 P = Pile("P") for c in "8524": P.empiler(c) P.affichage_contenu() P.retourner(20) P.affichage_contenu()