java - 在 Java 中打印 OO 表达式树

标签 java recursion tree expression

我正在研究面向 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());
    }
}

最佳答案

这是如何做中缀。一旦你看到这个是如何完成的,前缀和后缀对你来说应该是可能的。

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)

关于java - 在 Java 中打印 OO 表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5723395/

相关文章:

java - 无法理解科赫曲线分形曲线

Java递归查找图上的所有路径

python - 分层数据 : efficiently build a list of every descendant for each node

tree - 随机插入的二叉搜索树与红黑树

java - SSL 握手错误 javax.net.ssl.SSLHandshakeException Received fatal alert bad_certificate

java - Spring ScheduledTask - 启动/停止支持?

java - Java 中的 JMenuItem 组

c# - 如果函数包含同名的局部函数,如何递归调用函数?

algorithm - Delphi 图形的非递归深度优先搜索

perl - 重命名 File::Find 文件夹遍历中的项目