2011-04-19 4 views
2

자바 객체 지향 트리 할당에서 작업 중이며 프리픽스/삽입/접미어 형식의 표현 트리를 평가하고 인쇄 할 수 있어야합니다. 할당은 정적 유형이 "Exp"인 클래스 계층 구조와 몇 개의 단항 및 2 진 서브 클래스를 설명합니다.자바에서 OO 표현 트리를 인쇄

단항 및 이진 클래스가 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

+0

.. 서브 클래스에 의한 오버라이드를 피하기 위해서 ;-) – Rasmus

+0

서브 클래 싱을하지 않기 때문에 습관 일뿐입니다. 그것을 생략하십시오. – Olathe

0

에게 같은 방법으로 접근을. toString을 재정의하여 Binary의 경우 leftright에 대해 재귀 적으로 호출하고 Value 노드의 값을 반환합니다.

+0

친애하는 사이언 (Xion)님께, print 메소드로 정적 유형을 확장하고 재정의 된 toString과 함께 구현했습니다. 테스트에서 생성 한 표현식을 인쇄 할 때 재귀는 단 한 수준으로 만 나타납니다. – Rasmus