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());*/
}
}
Pourquoi utiliser 'Stack' quand vous avez déjà un arbre? aussi, 'n = root;' dans 'evaluateExpression()' jette la valeur de l'argument ... –