Skip to content
Snippets Groups Projects
Commit 76e6a7e6 authored by paul.albuquer's avatar paul.albuquer
Browse files

added transformation infixe-postfixe with stack

parent a457cd47
Branches
No related tags found
No related merge requests found
Pipeline #14886 passed
# Algorithmes et structures de données
# Deux applications des piles
*****
## La transformation infixe $\Leftarrow$ postfixe
Exemples:
| Expression infixe | | Expression postfixe |
|-----------------------|------------------|---------------------|
| A + B * C | transformé en | A B C * + |
| A + (B / C – D ^ E ) | transformé en | A B C / D E ^ – + |
A chaque opérateur, on associe une priorité, par exemple:
| Opérateur | Priorité |
|-----------|----------|
| ^ | 3 |
| *, / | 2 |
| +, - | 1 |
L'algorithme utilise une pile dans laquelle on stocke les opérateurs et les parenthèses ouvertes
rencontrées dans l'expression.
Les étapes sont les suivantes :
1. Examiner le prochain caractère dans l'expression donnée.
2. Si c'est un opérande, le mettre directement dans l'expression du résultat.
3. Si c'est une parenthèse ouverte, la mettre dans la pile avec la priorité zéro.
4. Si c'est un opérateur, comparer sa priorité avec celle de l'élément au sommet de la pile:
* Si la priorité de l'opérateur est plus grande que l'opérateur du sommet de la pile, empiler ce nouvel opérateur.
* Sinon prendre l'opérateur du sommet de la pile, le mettre dans l'expression du résultat et répéter la comparaison avec le nouveau sommet de la pile, jusqu'à ce qu'un opérateur de priorité inférieure à celle de l'opérateur de l'expression apparaisse au sommet de la pile ou jusqu'à ce que la pile soit vide.
5. Si c'est une parenthèse fermée, enlever de la pile les opérateurs et les placer dans l'expression du résultat jusqu'à ce qu'une parenthèse ouverte apparaisse au sommet de la pile, se défaire de cette parenthèse.
6. Si l'expression donnée est vide, enlever de la pile les opérateurs restants et les placer dans l'expression du résultat.
La table ci-dessous montre la réalisation d'une transformation infixe - postfixe sur une expression algébrique (supposée syntaxiquement correcte):
![Exemple de transformation infixe-postfixe](./figures/fig_transf_infixe_postfixe.png)
**Remarque:** On utilise aussi d'autres structures de données pour traiter ce problème. Entre autres les arbres.
## L'évaluation d'une expression en notation postfixée
La manière la plus simple de procéder est d'utiliser une pile contenant à chaque instant les valeurs des opérandes déjà calculés.
Dans une expression donnée sous forme postfixée, chaque opérateur porte sur les opérandes qui le précédent immédiatement, ceux ci doivent toujours se trouver en tête de pile au moment de l'opération. Le résultat d'une opération est un nouvel opérande qui est remis au sommet de la pile pour la suite de l'évaluation.
Les règles d'évaluation sont les suivantes:
* la valeur d'un opérande est toujours empilée.
* Un opérateur s'applique toujours aux 2 opérandes en tête de pile.
* Le résultat de l'opération est remis en tête de pile.
Exemple:
Soit l'expression postfixe à évaluer: A B C + * D -
| Caractères lus | Pile des opérandes (nombres) |
|----------------|------------------------------|
| A | A |
| B | A, B |
| C | A, B, C |
| + | A, B+C |
| * | A*(B+C) |
| D | A*(B+C), D |
| A | *(B+C)-D |
La pile contient finalement la valeur de l'expression.
Ce traitement exige naturellement que l'expression à évaluer soit syntaxiquement correcte.
\ No newline at end of file
lessons/figures/fig_transf_infixe_postfixe.png

69.7 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment