-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());*/
}
}
既にツリーがあるときに 'Stack'を使うのはなぜですか?また、 'evaluateExpression()'の 'n = root;'は引数の値をスローします... –