2017-10-01 1 views
-1

Nur besorgt über den ersten Test in der Test-Klasse, da die Wurzel des Baumes ist ein Operator "+" und seine sind Operanden/"Kinder" sind 3 und 4. Da die Wurzel ist "+" möchte ich pop das linke Kind und das rechte Kind und schieben Sie den Knoten zum Stapel. Versuchen zu verstehen, warum ich die pop() -Methode nicht aus der Stack-Klasse verwenden kann.Kann mir jemand sagen, warum die Verwendung von pop() in meinem evaulateExpression nicht funktioniert?

Knotenklasse

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 Klasse Import 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; 
} 

} 

Testklasse

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

Warum "Stack" verwenden, wenn Sie bereits einen Baum haben? auch 'n = root;' in 'evaluateExpression()' verwirft den Wert des Arguments ... –

Antwort

1

Ab dem Code

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

Wie die Stack API zeigt, wird die Pop-Funktion beliebige Parameter nehmen NICHT.

Es "[r] entfernt das Objekt an der Spitze dieses Stapels und gibt das Objekt als Wert dieser Funktion zurück."

Sie sollten eine andere Klasse verwenden, wenn Sie ein bestimmtes Objekt anstelle des oben auf dem Stapel befindlichen Objekts entfernen möchten.

Verwandte Themen