C3 : Exercices

Exercices d'entrainement

C3.E1 : Manipulation des piles

On s'intéresse aux structures de données de type pile que l'on implémente à l'aide des fonctions suivantes :

1) On considère la suite d'instructions suivante :

p1 = cree_pile()
p2 = cree_pile()
p3 = cree_pile()
empile(p1, 10)
empile(p1, 15)
empile(p1, 5)
empile(p2, 20)
empile(p2, 25)

Représenter les piles p1, p2 et p3 à la fin de l'exécution de ce code en recopiant et complétant le schéma ci-dessous.

2) Que renvoient les instructions suivantes :

3) Représenter les piles p1, p2 et p3 à la fin de l'exécution du code suivant :

empile(p3, depile(p2))
empile(p1, depile(p2))
empile(p2, depile(p3))
empile(p2, depile(p1))

4) Proposer une suite d'instructions de façon à inverser l'ordre des éléments de p1.

C3.E2 : Appartenance à une pile

1) Écrire une fonction est_dans(elt, pile:Pile) qui :

Remarque : cette fonction ne devra pas avoir d'effets de bords.

2) Ajouter la méthode contient(self, elt) à la classe Pile. Cette méthode doit prendre un élément en paramètre et renvoyer True ou False suivant si l'élément se trouve dans la pile ou non.

C3.E3 : Plus grande valeur d'une pile

Écrire une fonction maxi(p:Pile) qui :

Remarque : cette fonction ne devra pas avoir d'effet de bords.

C3.E4 : Nombre d'éléments d'une file

Écrire une fonction long(f:File)->int qui :

Remarque : cette fonction ne devra pas avoir d'effet de bords.

C3.E5(*) : Comparaison de deux files

Écrire une fonction sont_identiques(f1:File, f2:File) qui prend deux objets qui sont des instances d'une classe File en paramètres et renvoie True si les deux piles sont identiques ou False dans le cas contraire.

Remarque : les files passées en paramètres doivent retrouver leur état d'origine à la fin de l'exécution de la fonction.

Petits problèmes

C3.Pb1 : Un bon parenthésage

On considère une chaine de caractères incluant à la fois des parenthèses rondes () est des parenthèses carrées [].

La chaine est bien parenthésée si :

Par exemple :

1) Rappeler la spécificité des piles et des listes.

2) Quelle structure de données pour les parenthèses vous semble être la plus adaptée au problème ?

3) Écrire une fonction qui prend une chaine avec parenthèses en paramètre et renvoie True si la chaine est bien parenthésée ou False dans le cas contraire.

C3.Pb2 : Retour sur le jeu "Ranger les assiettes"

Pour cet exercice, on dispose d'une classe Pile dont l'interface est :

En utilisation cette classe Pile, programmer le jeu "Ranger les assiettes".

 

Le code ci-dessous n'est pas utile à la résolution de l'exercice, il est donné uniquement pour tester son programme.

class Pile:
    def __init__(self):
        self.__valeurs = []

    def est_vide(self):
        return len(self.__valeurs) == 0

    def empile(self, val):
        self.__valeurs.append(val)

    def depile(self):
        if not(self.est_vide()):
            return self.__valeurs.pop()
        else:
            return None

    def to_str(self) -> str:
        '''
        Méthode qui renvoie une chaine de caractère correspondant au contenu de la Pile.
        '''
        chaine = ""
        for val in self.__valeurs:
            chaine = chaine + str(val)
        return chaine

    def est_egale(self, pile2) -> Bool:
        '''
        Methode qui permet de tester l'égalité avec une autre pile passée en paramètre.
        Param pile2 (Pile)
        Return (Bool)
        '''
        pile2_inv = Pile()

        # Comparaison des éléments en dépilant pile2
        test = True
        if ( (self.est_vide() and not pile2.est_vide())
                or (not self.est_vide() and pile2.est_vide()) ) :
            test = False
        else:
            pos = len(self.__valeurs)-1
            while pos >= 0 and not pile2.est_vide():
                elt = self.__valeurs[pos]
                elt2 = pile2.depile()
                if elt != elt2:
                    test = False
                pile2_inv.empile(elt2)
                pos = pos - 1

            # Rempilage de pile2
            while not pile2_inv.est_vide():
                pile2.empile(pile2_inv.depile())

        return test

C3.Pb3 : Les tours de Hanoï

D'après l'encyclopédie en ligne Wikipédia, "Les tours de Hanoï" est un jeu de réflexion imaginé par le mathématicien français Édouard Lucas, et consistant à déplacer des disques de diamètres différents d'une tour de « départ » à une tour d'« arrivée » en passant par une tour « intermédiaire », et ceci en un minimum de coups, tout en respectant les règles suivantes :

On suppose que cette dernière règle est également respectée dans la configuration de départ.

Jeu des Tours de Hanoï

A faire : Programmer le jeu des Tours de Hanoï en Python en utilisant une structure de données de type Pile.