Conversion d'une expression infixée en une expression postfixée (Probleme avec l

Strick9 Messages postés 40 Date d'inscription mardi 8 novembre 2005 Statut Membre Dernière intervention 9 mai 2007 - 10 déc. 2006 à 14:22
Bouchekif Messages postés 4 Date d'inscription lundi 9 juin 2008 Statut Membre Dernière intervention 9 janvier 2011 - 3 nov. 2009 à 23:26
Salut a tous,

j ai un probleme lors de la coversion d'une expression arithmétique infixée ( exemple:  4 * 3 / ( 2 + 2 )      ) en un exprssion arithmetique postfixée (le resultat devrai être:    4 3 * 2 2 + /       ) mais j'obtient (   4 3 2 2  + / *   )

voila la classe qui fait cette conversion:

public class ExpressionInfixée
{
    private String ch;
    private Pile p = new PileListeTableau(String.class);
    public ExpressionInfixée(String Expression)
    {
        ch = Expression;
    }
    private String Extraire(int pos, String ch)
    {
        String res = "";

        int i = pos - 1;
        boolean stop = false;

        while ((stop == false) && (i >= 0))
        {
            if (ch.charAt(i) == ' ')
            {
                stop = true;
            }

            else
                res = ch.charAt(i) + res;
            i--;
        }
        return res;
    }

    public static int Priorite(String sc)
    {
        int P = 0;
        switch (sc.charAt(0))
        {
            case '(':
            case ')': P = 0; break;
            case '+':
            case '-': P = 2; break;
            case '*':
            case '/': P = 3;
        }
        return P;
    }

    public static String Extraire2(int debut, String expression)
    {
        String sous_chaine = null;
        int fin = expression.indexOf(' ', debut);
        if (fin != -1)
            sous_chaine = expression.substring(debut, fin);
        else sous_chaine = expression.substring(debut);
        if (sous_chaine.endsWith("+"))
            sous_chaine = "+" + sous_chaine.substring(0, sous_chaine.length() - 1);
        else if (sous_chaine.endsWith("-"))
            sous_chaine = "-" + sous_chaine.substring(0, sous_chaine.length() - 1);
        return sous_chaine;
    }
    private boolean Opérateur(Comparable e)
    {        if (e.compareTo("+") 0 || e.compareTo("-") 0 || e.compareTo("*") == 0 || e.compareTo("/") == 0)
            return true;
        else return false;
    }
    private boolean Opérande(Comparable e)
    {        if (e.compareTo("0") 0 || e.compareTo("1") 0 || e.compareTo("2") == 0 || e.compareTo("3") == 0 || e.compareTo("4") == 0 || e.compareTo("5") == 0 || e.compareTo("6") == 0 || e.compareTo("7") == 0 || e.compareTo("8") == 0 || e.compareTo("9") == 0)
            return true;
        else return false;
    }
 
    public String Postfixée()
    {
        boolean stop;
        String r = "";
        int i = 0;
        while (i < ch.length())
        {

            if (Extraire(i, ch).equals("("))
            {
                try
                {
                    stop = false;
                    while (stop)
                    {
                        if (Priorite((String)p.sommet()) >= Priorite(Extraire(i, ch)))
                        {
                            String var = (String)p.sommet();
                            p.depiler();
                            r = r + " " + var;
                            if (p.estVide())
                                stop = true;
                        }
                    }
                   
                    p.empiler(Extraire(i, ch));
                }
                catch (PileException e) { }
            }
            else if (Opérateur(Extraire(i,ch)))
            {
                try
                {
                    p.empiler(Extraire(i, ch));
                }
                catch (PileException e) { }
            }
            else if (this.Extraire(i, ch).equals(")"))
            {
                try
                {
                    while (!p.sommet().equals("("))
                    {
                        String v = (String)p.sommet();
                        if (!v.equals("("))
                        {

                            r = r + " " + v;
                            p.depiler();

                        }

                    }
                }
                catch (PileException e) { }
                try
                {
                    p.depiler();
                }
                catch (PileException e) { }
            }
            //else r = this.Extraire(i, ch) + " " + r;
            else r = r + this.Extraire(i, ch) + " ";
            i += this.Extraire(i, ch).length() + 1;
        }
        while (!p.estVide())
        {
            try
            {
                String v = (String)p.sommet();
                r = r + v + " ";
                p.depiler();
            }
            catch (PileException e) { }
        }
        return r.substring(0, r.length() - 1);

    }

}

j utilise pour faire cette conversion une pile et chaine String qui recoit les operateur selon leur priorité et les operande directement.
si quelqu'un voit ou mon probleme se situe, son aide serait du plus grand secours.
Merci pour avoir pris le temps de lire et merci d'avance pour votre aide.
bonnne journée.

2 réponses

JBAware Messages postés 174 Date d'inscription lundi 23 septembre 2002 Statut Membre Dernière intervention 6 avril 2011 1
14 déc. 2006 à 15:37
Personnellement je reverrai la conception en utilisant un arbre chainé ;)

JB...
0
Bouchekif Messages postés 4 Date d'inscription lundi 9 juin 2008 Statut Membre Dernière intervention 9 janvier 2011
3 nov. 2009 à 23:26
javascript:void(0);
0
Rejoignez-nous