2014-11-22 87 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()); 
    } 
    } 
}