2017-10-01 9 views
-1

Seulement inquiet de faire le premier test dans la classe de test puisque la racine de l'arbre est un opérateur "+" et ses opérandes/"enfants" sont 3 et 4. Comme la racine est "+" je veux pop l'enfant gauche et l'enfant droit et poussez le nœud vers la pile. Essayer de comprendre pourquoi je ne peux pas utiliser la méthode pop() de la classe Stack.Quelqu'un peut-il me dire pourquoi l'utilisation de pop() dans mon evaulateExpression ne fonctionne pas?

classe Node

public class Node <E> { 
E data; 
Node <E> left; 
Node <E> right; 

public Node(E data) { 
    this.data = data; 
} 

public Node(E data, Node <E> left, Node <E> right) { 
    this.data = data; 
    this.left = left; 
    this.right = right; 
} 

public String toString() { 
    return data.toString(); 
} 

} 

ExpressionTree classe importation java.util.Stack;

public class ExpressionTree { 
Node <String> root; 

public void buildTree(String expression) { 
    Stack < Node <String>> s = new Stack < Node <String>>(); 

    String expArray[] = expression.split(" "); 
    for (String st: expArray) { 
    switch (st) { 
    case "+": 
    case "-": 
    case "*": 
    case "/": 
    Node <String> right = s.pop(); 
    s.push((new Node <String> (st, s.pop(), right))); 
    break; 
    default: 
    s.push(new Node <String> (st)); 


    } 
    } 

    root = s.pop(); 
} 

public void printExpression() { 
    printExpression(root); 
    System.out.println(); 
} 

private void printExpression(Node <String> n) { 
    if (n != null) { 
    printExpression(n.left); 
    System.out.print(n); 
    printExpression(n.right); 
    } 
} 

public int evaluateExpression() { 

    return evaluateExpression(root); 
} 

public int evaluateExpression(Node <String> n) { 
    Stack < Node <String>> s = new Stack < Node <String>>(); 
    n = root; 
    if (n == null) { 
    return 0; 
    } else { 
    if (n.data.equals("+")) { 
    s.pop(n.left); 
    s.pop(n.right); 
    s.push(n); 
    evaluateExpression(n); 
    } 
    } 
    return 0; 
} 

} 

classe Test

public class ExpressionTreeTest { 

public static void main(String[] args) { 
    ExpressionTree et = new ExpressionTree(); 
    et.buildTree("3 4 +"); //infix: 3 + 4 
    et.printExpression(); 
    System.out.println(et.evaluateExpression()); 

    /*et.buildTree("3 4 2 * 1 5 -/+"); //infix: 3+4*2/(1-5) 
    et.printExpression(); 
    System.out.println(et.evaluateExpression()); 

    et.buildTree("3 4 5 * 2/+"); //infix: 3+4*5/2 
    et.printExpression(); 
    System.out.println(et.evaluateExpression()); 

    et.buildTree("12 8 + 6 5 - * 3 2 - 2 3 + * /"); //infix: (12+8)*(6- 
    5)/((3-2)*(2+3)) 
    et.printExpression(); 
    System.out.println(et.evaluateExpression());*/ 


} 

} 
+0

Pourquoi utiliser 'Stack' quand vous avez déjà un arbre? aussi, 'n = root;' dans 'evaluateExpression()' jette la valeur de l'argument ... –

Répondre

1

Comme du code

s.pop(n.left); 
s.pop(n.right); 

Comme le montre Stack API, la fonction pop ne prend aucun paramètre. Il "[r] émule l'objet en haut de cette pile et renvoie cet objet en tant que valeur de cette fonction."

Vous devez utiliser une autre classe si vous souhaitez supprimer un objet spécifique plutôt que tout ce qui se trouve en haut de la pile.