2017-10-01 14 views
-1

ツリーのルートが演算子 "+"であり、その被演算子/ "子"が3と4であるため、テストクラスで最初のテストが行​​われることのみが心配です。ルートは "+"左の子と右の子を選択し、ノードをスタックにプッシュします。スタッククラスからpop()メソッドを使用できない理由を理解しようとしています。誰でも私のevaulateExpressionでpop()の使用がうまくいかない理由を教えてもらえますか?

ノードクラス

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クラス 輸入java.util.Stackを。 Stack API示すように

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

} 

テストクラス

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

既にツリーがあるときに 'Stack'を使うのはなぜですか?また、 'evaluateExpression()'の 'n = root;'は引数の値をスローします... –

答えて

1
コードのよう

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

、ポップ機能は、任意のパラメータを取りません。

"[r]はこのスタックの先頭にあるオブジェクトを取り除き、そのオブジェクトをこの関数の値として返します。"

スタックの一番上にあるオブジェクトではなく、特定のオブジェクトを削除する場合は、別のクラスを使用する必要があります。

関連する問題