Pour cet exercice on s’intéresse à l’évaluation d’une expression arithmétique comme 5 + 2
ou (5 + 2) * 3
Evaluer une expression arithmétique comme 5 + 2 c’est lui associer le résultat du calcul ici 7
Pour réaliser cela on va supposer que les expressions sont sous la forme postfixée,
c’est à dire que l’opérateur + est écrit après les nombres 5 et 2
Ainsi 5 + 2 est écrit dans une liste sous la forme [5, 2 ,’+’] et (5 + 2) * 3 devient [5,2,’+’,3,’*’]
Regardons sur un exemple
Il s’agit d’évaluer (5 + 2) * 3 en partant de la liste [5,2,’+’,3,’*’] , voici l’algorithme :
On parcourt la liste
Si l’élément lu est un nombre on l’empile sur une pile P
Si l’élément lu est un opérateur parmi ’+’,’-’,’*’ on dépile P deux fois
et on calcule le résultat de l’opération associée à l’opérateur
et appliquée aux deux éléments dépilés
Ce résultat est empilé sur la pile P
A la fin du parcours de la liste, il reste une seule valeur dans la Pile qui est le résultat du calcul
Calculer le résultat de l’opération associé à l’opérateur
se fait par l’intermédiaire d’un dictionnaire
qui fait l’association entre le symbole de l’opérateur
par exemple ’+’ de type str et la fonction associée appelée somme
Questions
On rappelle les primitives d'une pile
creer_pile_vide() qui crée une pile vide
est_vide(p) qui renvoie vrai si la pile p est vide et faux sinon
empiler(p,x) qui empile la valeur x sur la pile p
depiler(p) qui enlève le sommet de la pile p et renvoie cette valeur
Implémenter ces primitives avec une liste Python
Créer un dictionnaire operations où les clés sont les caractères '+','-',
'*' et '/' et les valeurs associées les noms de fonctions somme,difference,
produit et quotient
Implémenter les fonctions associées
Ecrire une fonction eval(expr) qui prend en paramètre une liste contenant
les termes d'une expression postfixée correcte, et qui renvoie la
valeur de cette expression avec l'algorithme ci-dessus
Tester sur plusieurs expressions de votre choix
Implémentation d'une file avec un tableau
Définir une classe File_tab, dont les attributs sont
taille un entier égale à la taille du tableau
contenu un tableau de taille égale à taille
tete un entier compris entre 0 et taille - 1, est un indice
repérant l'élément en tête de file dans contenu (initialisé à 0)
queue un entier compris entre 0 et taille - 1, est un indice
repérant la cellule dans contenu où pourrait venir
un nouvel élément dans contenu, à moins que la file soit déjà pleine (initialisé à 0)
les méthodes sont
est_file_vide() qui retourne vrai si la file est vide. C'est le cas
lorsque tete == queue
On a fait le choix de ne mettre au plus que taille - 1 éléments
dans la file pour pouvoir distinguer les cas où la file est pleine et
où la file est vide
est_file_pleine() qui retourne vrai si la file est pleine . C'est le cas
lorsque tete == (queue+1)%taille
enfiler(val) qui ajoute un élément val dans la file si la file
n'est pas pleine (ajouter un message d'erreur)
defiler() qui retourne le premier arrivé dans la file si la file
n'est pas vide (ajouter un message d'erreur)