2011-04-19 79 views
2

我工作的一個Java面向對象的表達式樹分派,我需要能夠在前綴/中綴/後綴格式,評估和打印表達式樹。該分配描述了一個靜態類型爲「Exp」的類層次結構以及多個一元和二元子類。打印OO表達式樹在Java中

我已經通過具有一元和二元類實現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()); 
    } 
} 

回答

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)

+0

奇妙(!):-)請問爲什麼你聲明方法是最終的? – Rasmus 2011-04-19 22:51:08

+0

..以避免任何重寫的子類當然;-) – Rasmus 2011-04-19 23:05:56

+0

這只是一個習慣,因爲我通常不做任何子類化。隨意忽略它。 – Olathe 2011-04-19 23:08:09

0

以同樣的方式接近它。覆蓋toString,使其調用它遞歸leftrightBinary情況下,並返回Value節點的值。

+0

親愛的錫安,我伸出我的靜態類型與打印方法,並與重寫的ToString一起實現這一點。當打印我在測試中創建的表達式時,遞歸看起來只會變成一個層次? – Rasmus 2011-04-19 22:38:33