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