我正在开发一个面向java对象的表达式树分配,我需要能够以前缀/中缀/后缀格式评估和打印表达式树。该赋值描述了一个具有静态类型“Exp”的类层次结构以及几个一元和二元子类。
我通过让一元和二元类实现eval()方法(由根类型“Exp”指定)解决了eval部分,但需要帮助打印表达式。我已经和它一起工作了好几天而已经无处可去。我在网上找到的所有帮助都是关于具有运算符和值字段的二进制类(我的赋值将它们作为两个不同的类)。请给我一个正确的方向 - 我将非常感激: - )
祝福, 拉斯穆斯
public interface Exp { double value(); }
public class Value implements Exp {
private double value;
public Value(double val) { this.value = val; }
public double value() { return this.value; }
}
public class Binary implements Exp {
private char op; private Exp right; private Exp left;
public Binary(char op, Exp left, Exp right) {
this.op = op; this.left = left; this.right = right;
}
}
public double value() { // sum up using recursion
switch(this.op) {
case '+': return this.left.value()+this.right.value();
case '-': return this.left.value()-this.right.value();
case '*': return this.left.value()*this.right.value();
case '/': return this.left.value()/this.right.value();
default: return Double.NaN;
}
}
}
public class Main { //calculating total ok - needs printing!
public static void Main(String[] args) {
Exp valLeft = new Value(10);
Exp valRight = new Value(5);
Exp bN1 = new Binary('+', valLeft, valRight);
Exp bN2 = new Binary('+', bN1, new Value(3));
System.out.println(bN2.value());
}
}
答案 0 :(得分:1)
以下是如何进行中缀。一旦你看到这个怎么做,你就可以使用前缀和后缀。
在Exp
界面中,添加:
String asInfix();
在Binary
课程中,添加:
public final String asInfix() {
return "(" + left.asInfix() + " " + op + " " + right.asInfix() + ")";
}
在Value
课程中,添加:
public final String asInfix() {
return "" + value;
}
现在,您可以System.out.println(bN2.asInfix());
显示((10.0 + 5.0) + 3.0)
。
答案 1 :(得分:0)
以同样的方式处理它。覆盖toString
,以便在left
的情况下以递归方式调用right
和Binary
,并返回Value
个节点的值。