2017-09-16 9 views
0

Je dois évaluer une expression de préfixe en utilisant des piles, je l'ai fait mais je ne comprends pas pourquoi le code ne fonctionne pas correctement, il marque 2 bogues lorsque je compile le code, ils sont:Évaluer une expression de préfixe en utilisant des piles

Exception dans le thread "principal" java.lang.ClassCastException: java.lang.String ne peut pas être jeté à java.lang.Integer à evaluationprefix.EvaluationPreFix.EvaluationPrefix (EvaluationPreFix.java:56) à evaluationprefix.EvaluationPreFix. principal (EvaluationPreFix.java:25)

public class EvaluationPreFix { 

public static void main(String[] args) { 
    Stack st = new Stack(); 
    Scanner sc = new Scanner(System.in); 

    System.out.println("enter the size of expression"); 
    int t = sc.nextInt(); 
    sc.nextLine(); 
    for (int i = 0; i < t; i++) { 
     System.out.println("enter an element"); 
     String element = sc.nextLine(); 
     st.push(element); 
    } 

    int r = EvaluationPrefix(st); //marks an Error here 
    System.out.println("Result: " + r); 

} 

public static int EvaluationPrefix(Stack st) { 
    Stack st2 = new Stack(); 

    while (!st.isEmpty()) { 
     Object e = st.pop(); 
     if (e.equals('+')) { 
      st2.push((Integer) st2.pop() + (Integer) st2.pop()); 
     } else if (e.equals('-')) { 
      st2.push((Integer) st2.pop() - (Integer) st2.pop()); 
     } else if (e.equals('*')) { 
      st2.push((Integer) st2.pop() * (Integer) st2.pop()); 
     } else if (e.equals('/')) { 
      st2.push((Integer) st2.pop()/(Integer) st2.pop()); 
     } else { 
      st2.push(e); 
     } 
    } 
    return (Integer) st2.pop();//marks an error here 
} 

} 

Répondre

0

Les modifications apportées:

  • Dans la principale méthode, a changé la pile, st, type String.
  • Dans le procédé EvaluationPrefix,
    • changé la pile de paramètre du type String.
    • changé la pile, st2, au type Integer.
    • a modifié les opérateurs arithmétiques au sein de equals à String.

Ici, vous allez,

public class EvaluationPreFix { 

    public static void main(String[] args) { 
     //1. parameterized with String 
     Stack<String> st = new Stack(); 
     Scanner sc = new Scanner(System.in); 

     System.out.println("enter the size of expression"); 
     int t = sc.nextInt(); 
     sc.nextLine(); 
     for (int i = 0; i < t; i++) { 
      System.out.println("enter an element"); 
      String element = sc.nextLine(); 
      st.push(element); 
     } 

     int r = EvaluationPrefix(st); //marks an Error here 
     System.out.println("Result: " + r); 

    } 

    //2. parameterized with String 
    public static int EvaluationPrefix(Stack<String> st) { 
     //3. parameterized with Integer 
     Stack<Integer> st2 = new Stack(); 

     while (!st.isEmpty()) { 
      String e = st.pop(); 
      //4. arithmetic sign comparison to string instead 
      //of character 
      if (e.equals("+")) { 
       st2.push(st2.pop() + st2.pop()); 
      } else if (e.equals("-")) { 
       st2.push(st2.pop() - st2.pop()); 
      } else if (e.equals("*")) { 
       st2.push(st2.pop() * st2.pop()); 
      } else if (e.equals("/")) { 
       st2.push(st2.pop()/st2.pop()); 
      } else { 
       st2.push(Integer.valueOf(e)); 
      } 
     } 

     return st2.pop(); 
    } 

} 
+0

Je pense que partout où vous utilisez 'st.push' il devrait être' st2.push' (lors de la vérification des opérateurs) –

+0

Non. Seul le dernier sur passe à 'st2'. Essayez-le, par exemple, 2 3 + vous donnera un résultat de 5. Vous devez repousser dans la même pile. –

+0

mais c'est préfixe, donc ça devrait être + 2 3 –

0

En supposant que nous parlons de java.util.stack - Ceci est juste une collection stockant ce que vous poussez dedans, et vous l'utilisez comme type brut. Cela signifie que vous pouvez pousser des objets de n'importe quel type sur cette pile. Il semble que vous voulez seulement stocker Integers - dites au compilateur à ce sujet en utilisant des génériques.

Stack<Integer> st = new Stack<>(); 

Cela vous dira que le problème est là où vous essayez de convertir e à un Integer by casting, because in your case, the values of e are the chaîne s you pused into st in main() `.

Vous devez également remplacer la déclaration de st en main avec

Stack<String> st = new Stack<>(); 

et la déclaration de méthode pour

public static int EvaluationPrefix(Stack<String> st) 

pour mettre en évidence le problème. Si vous avez un String et que vous voulez le convertir en Integer, vous devez l'analyser, par exemple en utilisant Integer.parseInt. Mais vous devez être conscient que cette méthode va lancer un NumberFormatException si le String n'est pas un nombre. Vous devrez gérer cette exception, par exemple en l'attrapant et en imprimant un message d'erreur utile.

+0

droite, maintenant le problème serait ici 'st2.push (e),' 'parce e' est' 'CHAINE' et st2' est seulement pour les entiers, alors comment pourrais-je le réparer? –

+0

Je ne peux pas faire un cast –