Vous êtes sur la page 1sur 4

Piles

PSI 2018/2019

I Les fonctions de base


On pourra utiliser des piles à capacité bornée ou non. Pour les implémenter, on utilisera une
structure de liste. Seules les fonctions append() et pop() seront autorisés sur les listes.

1. Ecrire une fonction creer_pile() qui renvoie une pile vide.


2. Ecrire une fonction est_vide(p) qui détecte la présence d’une pile vide.
3. Ecrire une fonction empiler(p,e) qui empile l’élément e dans la liste p.
4. Ecrire une fonction depiler(p) qui dépile le sommet de la pile p et qui renvoie le sommet en
question.

II Fonctions supplémentaires
Pour implémenter les fonctions suivantes, on utilisera uniquement les fonctions creer_pile(),
est_vide(p), empiler(p,e) et depiler(p) et/ou les fonctions définies dans l’exercice.

1. Ecrire une fonction regarder(p) qui permet de voir le sommet de la pile p.


2. Ecrire une fonction inverser(p) qui crée une pile dont le contenu est l’inverse de la pile p.
Attention, il ne faut pas que la pile p soit détruite dans le processus.
3. Ecrire une fonction dupliquer(p) qui créé une copie de la pile p.

III Ecriture en base 10


On considère un entier positifn et le code suivant qui permet de déterminer l’écriture de n en
base 10 :
def afficher_base10 ( n ):
while n !=0:
print n %10
n = n / /10

afficher_base10 (127)
On détermine l’écriture de n en base 10 à l’aide de divisions successives par 10. Cependant,
comme on peut le constater, les différents chiffres apparaissent dans l’ordre inverse de l’ordre
d’écriture habituel. En utilisant une pile, modifier la fonction afficher_base10 pour que l’affichage
soit effectué dans l’ordre habituel.

1
PSI - Informatique page 2/4

IV Rangement de wagons
Des wagons portant un numéro sont disposés sur un tronçon de voie OC qui est relié par un
aiguillage à deux voies OA et OB.
Il est possible d’envoyer le wagon le plus à gauche de la voie OC sur l’une des voies OA ou
OB et, de même, on peut déplacer le wagon le plus à droite des voies OA ou OB vers la voie OC.

1. On veut réordonner les wagons de la voie OC afin que ceux avec un numéro pair se trouvent à
gauche de ceux portant un numéro impair. Expliquer comment modéliser ce problème à l’aide
de trois piles et donner un algorithme réalisant ce travail.

2. On veut maintenant réordonner les wagons dans l’ordre croissant des numéros. Donner un
algorithme permettant de réaliser cette opération. On utilisera la fonction regarder définie plus
haut.
Indications :
— L’algorithme désempilera la voie OC jusqu’à ce qu’elle soit vide. On ne réempilera pas de
wagon sur cette voie.
— A la fin de chaque étape de l’algorithme, la voie OA contiendra des wagons ordonnés, la
voie OB sera vide.

V Labyrinthe parfait
On cherche à construire un labyrinthe parfait. Dans de tels dédales, il existe un et un seul chemin
reliant deux paires de points du labyrinthe. Voici un exemple de construction d’un labyrinthe parfait
de dimension n × n avec n = 20.

Pour construire ce labyrinthe, on considère une grille laby de taille n × n initialement remplie
de zéros. On trace le labyrinthe en visitant chaque point de la grille en suivant l’algorithme décrit
ci-dessous :
PSI - Informatique page 3/4

• on part du point inférieur gauche de coordonnées (0,0). On marque ce point comme visité
en remplaçant le 0 par un 1 dans laby. On stocke cette position dans une pile.
• On regarde quels sont les points voisins et non visités de (0,0) sur la grille. Dans ce cas :
— S’il y a au moins une possibilité, on en choisit une au hasard, et on recommence avec le
nouveau point.
— S’il n’y en pas, on désempile la position de la pile, on revient au point précédent et on
recommence.
• Lorsque l’on est revenu au point de départ et qu’il n’y a plus de possibilités (la pile est
vide), le labyrinthe est terminé.

La fonction labyrinthe(n) ci-dessous permet de tracer un labyrinthe de taille n, mais il manque


la définition de certaines fonctions.
import turtle as tt
import random as rd

def labyrinthe ( n ):

P = creer_pile ()

tortue . up ()
tortue . goto ( -200 , -200)
tortue . down ()
depart =[0 ,0]
empiler (P , depart )
visite ( depart )

while not ( est_vide ( P )):


cellule = desempiler ( P )
(x , y ) = cellule
tortue . goto (30* x -200 ,30* y -200)
L = vois ins_non _visites ( cellule , n )

if len ( L ) > 0:
next_cellule = tirage ( L )
visite ( next_cellule )
empiler (P , cellule )
empiler (P , next_cellule )

V.1 A vous !
1. Ecrire la fonction visiter(c) prenant en argument une liste de deux coordonnées c = [x,y]
et qui marque le point de coordonnées (x,y) comme visité dans le tableau laby.
2. Créer une fonction est_visite(x,y,n) renvoyant True si le point du labyrinthe de coordonnées
(x,y) a déjà été visité ou si les coordonnées (x,y) sont situées en dehors du labyrinthe et False
sinon.
3. Créer une fonction voisins_non_visites(c,n) qui, étant donné une position c = [x,y], dé-
termine les positions adjacentes non encore visitées. Le résultat est renvoyé sous forme d’une
liste (contenant donc de 0 à 4 éléments).
PSI - Informatique page 4/4

4. Créer une fonction tirage(L)qui renvoie un élément au hasard dans une liste L. On importera
le module random de Python et on pourra utiliser la fonction randint(a,b) qui renvoie un
entier aléatoire entre a et b.

Vous aimerez peut-être aussi