Langages de programmation – TP9 Structures de données et

publicité
Langages de programmation – TP9
Structures de données et algorithms en JAVA
En classe :
Notation polonaise inversée - Reversed Polish Notation (RPN)
• RPN: une notation mathématique dans laquelle chaque opérateur suit l'ensemble de ses
opérandes
• Exemples:
– 3 +4 devient 3 4 +
– 3 - 4 + 5 devient 3 4 + 5 - (l'opérateur apparaît immédiatement après le second
opérande)
• Avantage:
– Il élimine les parenthèses : 3 - (4 + 5) devient, sans doute 3 4 5 + – L'évaluation des expressions arithmétiques est plus rapide
• Mise en œuvre: avec PILE
Infixe expression (par exemple IE = 3 +4) -> Postfix expression (par exemple PE = 3 4 +)
• Passer par IE de gauche à droite (avec une instruction de boucle)
– Si un opérande est rencontré, ajoutez-le à PE
– Si "(" est rencontré, poussez-le à STACK
– Si un opérateur est rencontré, alors:
• pop de la pile à plusieurs reprises et ajouter à chaque opérateur PE qui a la
même priorité ou supérieur avec l'opérateur rencontrés (si la pile n'est pas
vide)
• ajouter l'opérateur rencontre de la pile
– Si ")" est rencontré, alors:
• pop de la pile à plusieurs reprises et ajouter à chaque opérateur PE jusqu'à
ce que "(" se trouve dans la pile
• enlever le "(" de la pile: ne pas ajouter "(" à PE)!!
– Lorsque IE est vide, ajoutez tous les éléments de la pile au PE
– Affichage PE
• Exemple sur le tableau noir pour IE = (5-6/2)*(1+3)
• http://scriptasylum.com/tutorials/infix_postfix/algorithms/infixpostfix/index.htm
Implementez l’algorithme en JAVA.
Évaluer Expression Postfix
• Ajouter ";" à la fin de PE
• Passer par PE de gauche à droite, avec une boucle while-do: while PE[i]!=“’;” do
– si PE [i] est l'opérande, poussez-le à STACK
– si PE [i] est l'opérateur, puis:
• pop de l'élément de la pile et l'a appelé avec A
• pop de l'élément de la pile et l'a appelé avec B
• effectuer B opérateur A et pousser le résultat dans le STACK
– Peek la pile et l'afficher la tête (le résultat de l'opération)
• Exemple sur le tableau noir pour
PE = 5 6 2 / - 1 3 + *
Devoir
1.
Implementez l’algorithme pour evaluer expressions postfix en JAVA.
2.
Ecrivez un programme qui lit des parenthèses dans une chaîne d'entrée standard et
détermine si ses parenthèses sont correctement équilibrées. Par exemple, votre programme doit
imprimer vrai (true) pour [()]{}{[()()]()} et faux (false) pour [(]).
Suggestion : utilisez une pile (Stack).
Stack<Character> stack1 = new Stack<Character>();
stack.push('(');
Pour utilisez stacks, vous devez ecrivez au début du programme:
import java.util.Stack;
Algorithme: nous traversons la chaîne de gauche à droite
• Nous poussons sur la pile chaque parenthèse ouverte
• Pour chaque parenthèse fermeé, la parenthèse à la tête de la pile doit être une parenthèse
ouverte du même type (et la pile ne doit pas être vide) => puis nous retirons la parenthèse
ouverte de la pile
• En fin de compte, la pile doit être vide
Téléchargement