2014-11-22 4 views
0

안녕하세요. 저는 Java에서 Stack 클래스로 작업하고 있습니다. 문제는이 스택에서 String 유형의 요소를 삽입하려는 것입니다.나는 스택에 나무를 밀어 넣는 법을 모르겠다.

가이 코드는 기본적으로 나는 표현의 입력을 필요이를 위해, 이진 트리에 수학 식을 변환

public static void Expression(Stack<String> exp) 
    { 
     boolean error = false; 
     String leftExp,rightExp = ""; 
     Stack<String> stackOp = new Stack<String>(); 
     while(!exp.empty() && (error == false)) 
     { 
      switch(elementType(exp.peek())){ 
       case 'I': 
        error = true; 
        break; 
       case 'O': 
        if(stackOp.size() < 2) 
        error = true; 
        else 
        { 
         rightExp = stackOp.pop(); 
         leftExp = stackOp.pop(); 
         Tree subTree = new Tree(); 
         subTree.insertNode(exp.peek()); 
         subTree.insertNode(rightExp); 
         subTree.insertNode(leftExp); 
         stackOp.push(subTree);//here is were I have the mistake 
        } 
        break; 
       default: 
        stackOp.push(exp.peek()); 
      } 
     } 
    } 

    public static char elementType(String car){ 
     char c = 'Z'; 
     if(car.equals("(")) 
      c = 'I'; 
     else if(car.equals(")")) 
      c = 'D'; 
     else if(car.equals("+") || car.equals("-") || car.equals("*") || car.equals("/")) 
      c = 'O'; 
     return c; 
    } 
, 출력 인 :하지만 난 또한 나무를 삽입 할 코드는이 다음이다 이진 트리 및 변수, 숫자 및 하위 트리가 포함 된 다른 로컬 스택이 있습니다. 하지만 어떻게 다른 유형의 요소를 포함하는 스택을 만들 수 있습니까?

+0

스택은 레거시 (구식) 컬렉션이므로 대신 Deque (인터페이스로 사용) 및 ArrayDeque (구현으로)를 사용하는 것이 좋습니다. –

+0

'Stack '는 문자열 리터럴 만 포함 할 수 있습니다. 논리를 수정하거나 'Stack'에서 Type을 제거해야합니다. – BatScream

답변

2

스택에 넣을 수있는 모든 것을 담을 수있는 클래스를 만듭니다. 문자열을 사용하여 작업을 지정하는 것은 약간 어색하지만 자신에게 적합하다고 생각합니다. 클래스가 StackElement 인 경우 유형 표시기 (Java enums 살펴보기)와 원하는대로 얻거나 얻을 수있는 메소드를 포함 할 수 있습니다.

여러 유형 중 하나에 대한 참조를 포함하도록 StackElement을 정의한 다음 포함될 수있는 모든 유형의 모든 메소드를 정의 할 수도 있습니다. 적용되는 패스 스루가 패스 스루 (조작이 getOperationType()의 패스 스루) 인 경우, 나머지는 illegalOperationException 등을 슬로우합니다. 따라서 값에 getOperationType()을 호출하려고하면 연산에 getValue()를 호출 할 때와 마찬가지로 예외가 발생합니다.

이렇게하면 좋은 방법은 할 필요가 없다는 것입니다. 모든 instanceof 저장 한 유형의 테스트. FILO 큐를 선언하여 StackElement 객체를 보유하고, 원하는 유형으로 만들고, 사용하고, 모두 instanceof 또는 그렇지 않으면 OO 스타일을 사용하지 않습니다.

public class StackElement 
{ 
    private StackElementType type; 
    private StackOperation operation; 
    private StackValue  value; 

    public StackElementType getType() { return type; } 

    public StackOperation getOperation() 
    { 
    switch (type) 
    { 
     case StackElementType.OPERATION: return operation; 
     default: throw IllegalOperationException 
       ("getOperation() on type " + type.toString()); 
    } 
    } 

    public StackValue getValue() 
    { 
    switch (type) 
    { 
     case StackElementType.VALUE: return value; 
     default: throw IllegalOperationException 
       ("getValue on type " + type.toString()); 
    } 
    } 
} 
관련 문제