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.