Exercice sur les piles et l'écriture polonaise
Nitram140
-
Nitram140 -
Nitram140 -
Bonjour, ma consigne est la suivante : écrivez en Python une fonction qui prend en paramètre une liste contenant la représentation en notation postfixée d'une expression arithmétique et qui renvoie sa valeur.
Je me suis donc lancé et j'ai réalisé le programme postf en utilisant des fonctions classiques pour manipuler les piles.
je m'y prends de la manière suivante : si un élément de la liste est un nombre, je l'empile ; si c'est un opérateur, je dépile les deux éléments de la pile et je fait le calcul puis j'empile le résultat.
Mon soucis est que mon while ne boucle pas et je ne comprends pas pourquoi vu que je dépile à l'intérieure de cette boucle ce qui devrait diminuer la taille de la pile dont je veux enlever les deux éléments pour réaliser par la suite l'opération.
Merci d'avance.
Je me suis donc lancé et j'ai réalisé le programme postf en utilisant des fonctions classiques pour manipuler les piles.
je m'y prends de la manière suivante : si un élément de la liste est un nombre, je l'empile ; si c'est un opérateur, je dépile les deux éléments de la pile et je fait le calcul puis j'empile le résultat.
#Création d'une pile# def creer_pile(): return[] #Empilement d'une valeur# def empiler(p,val): """ajout de val au sommet de p""" p.append(val) return(p) #Nombre d'éléments# def taille(p): """calcul du nombre d'éléments""" return(len(p)) #Test de vacuité# def est_vide(p): """True si vide, False sinon""" return(len(p)==0) #Dépilement d'une valeur# def depiler(p): """suppression et renvoi du sommet""" if not est_vide(p): return(p.pop()) #Lecture de la valeur au sommet# def sommet(p): """renvoi de la valeur sommet""" if not est_vide(p): return(p[-1]) def postf(liste): pile=[] liste2=[] #liste annexe pour les calculs for k in liste: if k!="+" and "-" and "*" and "/": #on empile si l'élément n'est pas un opérateur empiler(pile, k) else: while taille(pile)!=taille(pile)-2: #sinon on depile deux éléments qu'on empile dans la liste annexe empiler(liste2,depiler(pile)) for i in range(len(liste2)): #en utilisant cette liste annexe on peut réaliser les calculs selon la condition sur k if k=="+": r=liste2[i]+liste2[i+1] elif k=="-": r=liste2[i]-liste2[i+1] elif k=="*": r=liste2[i]*liste2[i+1] elif k=="/": r=liste2[i]/liste2[i+1] empiler(pile,r) return(pile, ann)
Mon soucis est que mon while ne boucle pas et je ne comprends pas pourquoi vu que je dépile à l'intérieure de cette boucle ce qui devrait diminuer la taille de la pile dont je veux enlever les deux éléments pour réaliser par la suite l'opération.
Merci d'avance.
Configuration: Windows / Chrome 93.0.4577.63
A voir également:
- Exercice sur les piles et l'écriture polonaise
- Écriture facebook - Guide
- Ecriture en gras - Guide
- Ecriture instagram - Guide
- Écriture à l'envers miroir - Guide
- Piles manette wii - Forum Wii