Objectifs du TP Chauffe La notation polonaise inversée

Transcription

Objectifs du TP Chauffe La notation polonaise inversée
MP?
TP : M ANIPULATION DE PILES
2016/2017
La notation polonaise inversée
L’usage d’une pile est naturel lors de l’évaluation post-fixée d’une expression algébrique.
Le principe est le suivant : une expression algébrique, par exemple
Objectifs du TP
¡
¡ ¢¢
(1 + 2) × 3 − 4/ 52
• Manipulation la notion (abstraite) de pile informatique indépendamment de son
implémentation.
Les implémentations des piles vues en cours se trouvent à votre disposition dans
les fichiers pile_bornee.py et pile_non_bornee.py.
Pour utiliser l’une d’elles, importer le contenu du fichier avec from ... import *
(pas de copier-coller).
L’idée est de n’utiliser que les primitives basiques sur les piles (la barrière d’abstraction...) : empile, depile et est_vide. On pourrait aussi utiliser directement des
listes python et se limiter à append(), pop() et == [].
peut être représentée avec un arbre dont les nœuds sont les opérations et les feuilles
les nombres.
Ici, il s’agit d’un produit entre une somme et la différence entre un nombre et le
quotient d’un nombre avec le carré d’un nombre. Cela donne l’arbre :
×
1
Chauffe
−
+
3
2
/
∧
4
1. Écrire une fonction copie(p) qui renvoie une copie de la pile p , laissant celle-ci
dans le même état que son état initial.
Quelle est la complexité temporelle et spatiale ?
2. Écrire une fonction miroir(p) qui renvoie la pile dont les éléments sont les
éléments de p , dans l’ordre inverse.
Quelle est la complexité temporelle et spatiale si on autorise la modification de p ?
Sinon ?
3. Écrire une fonction taille(p) calculant la taille d’une pile. Quelle est sa complexité temporelle ? spatiale ?
4. Écrire une fonction permettant de lire (sans l’extraire) le n e élément d’une pile.
On gérera la cas où la pile n’est pas assez grande.
5
2
Le principe du parcours postfixe d’un arbre consiste à lire d’abord le sous-arbre (appelé fils) gauche, puis le fils droit, puis effectuer l’opération (qui se trouve au nœud).
Ici, cela donne :
·h ih i³ ´¸
1 2 +
· h i h
£ ¤£
3
4
[5] [2] (∧)
¸
¤¡ ¢i ³ ´
/
−
µ ¶
×
L’idée est donc, pour évaluer cette expression, d’utiliser un tableau
[ 1, 2, ’+’, 3, 4, 5, 2, ’**’, ’/’, ’-’, ’*’ ]
5. Écrire une fonction qui prend une pile non vide en argument et place l’élément
situé à son sommet tout au fond de la pile, en conservant l’ordre des autres éléments.
Quelle est sa complexité en temps et en espace ?
correspondant à ce parcours de l’arbre.
Un avantage de cette écriture de l’expression est l’affranchissement complet de parenthésage.
Traditionnellement, les calculatrices HP utilis(ai ?)ent cette notation appelée RPN
(pour Reverse Polish Notation) à l’origine parce que les machines n’étaient pas assez
puissantes pour gérer les parenthésages mais qui s’avère très pratique à l’usage.
TP piles - page 1
TP piles - page 2
La calculatrice affiche (et gère) en permanence une pile (le sommet est affiché en
bas de l’écran), et pour calculer l’expression précédente,
[1] on tape
1
[2] puis
ENTER
2
ENTER
7. Écrire une fonction evalue_rpn(expr) où expr est un tableau correspondant
à l’écriture postfixe d’une expression et qui à l’aide d’une pile, va calculer l’expression sur le même principe que l’illustration HP ci-dessus. On pourra utiliser une liste
d’opérateur binaires autorisés.
Remarque : il ne serait pas difficile de rajouter des opérateurs unaires comme des fonctions
p
cos, sin, exp, ·... à essayer !
Les îlots du jeu de la vie
[3] puis
+
[4] puis
2
[5] puis
[7] puis
yx
−
3
ENTER
4
ENTER
5
ENTER
ENTER
[6] puis
On appelle chemin dans un quadrillage une suite de cases telle que deux
cases consécutives soient voisines (on rappelle que chaque case a 8 voisines).
L’ensemble des cellules vivantes de l’univers peut être découpé en îlots qui
sont les composantes connexes définies par la relation de voisinage : entre
deux cellules vivantes d’un même îlot, il y a toujours un chemin ne passant
que par des cellules vivantes.
÷
[8] et enfin
Les piles peuvent être utiles pour déterminer des composantes connexes dans des
graphes (parcours en profondeur) : pour connaître tous les voisins d’un élément, on va
chercher tous les voisins de ses voisins et ainsi de suite.
En reprenant la question 14 du TP sur le jeu de la vie, l’idée va être, à partir de la
grille initialisée comme indiqué à la question 9 (par exemple), d’appliquer la définition
que l’on rappelle :
×
.
8. On souhaite écrire une fonction ilot(grille, i, j) renvoyant une pile de
tous les points de l’îlot (donc de la composante connexe) de la cellule (i , j ) sans répétition (supposée vide si la cellule est morte).
L’idée va être d’utiliser :
• Une pile a_visiter contenant toutes les cellules vivantes dont on doit encore
visiter les voisines.
• Un tableau de tableaux de booléen pas_traite tel que
pas_traite[x][y] = True
Comme les calculatrices HP, nous allons utiliser une pile pour faire les calculs correspondant à la notation polonaise inversée à partir d’entrées stockées initialement
dans un tableau.
si l’on na pas encore rencontré la cellule (x, y)
• Une pile CC dans laquelle on va construire au fur et à mesure la composante
connexe de (i, j).
6. Écrire une fonction opere_bin(op, a, b) qui à partir d’une chaîne de caractères op et de deux nombres a et b réalise l’opération correspondante entre a et b et
renvoie le résultat.
9. Écrire une fonction calculant le nombre d’îlots (c’est-à-dire de composantes
connexes).
TP piles - page 3
TP piles - page 4

Documents pareils