2014-11-22 22 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(作爲實現)來代替。 – 2014-11-22 01:34:57

+0

'堆棧'只能包含字符串文字。你需要修改你的邏輯或從它移除''Stack'的類型。 – BatScream 2014-11-22 02:03:27

回答

2

創建一個可容納要放置在堆棧上的任何一類 - 我想用一個字符串來指定你的操作是一個有點笨拙,但適合自己。如果你有一類就是StackElement,它可以包含一個類型指示器(考慮Java的枚舉)和方法做或獲得任何你想要的。

您可以定義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()); 
    } 
    } 
} 
相關問題