我不知道如何将树推入堆栈

时间:2014-11-22 01:30:10

标签: java

您好我正在使用Java中的Stack类,我的问题是在这个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;
    }

这段代码基本上将数学表达式转换为二叉树,为此我需要一个输入,即表达式,一个输出是二叉树,另一个本地堆栈包含变量,数字和子树。但是,如何制作包含不同类型元素的Stack?

1 个答案:

答案 0 :(得分:2)

创建一个可以容纳任何你想要放在堆栈上的类 - 我认为使用字符串来指定你的操作有点笨拙,但适合自己。如果你有一个StackElement的类,它可以包含一个类型指示器(查看Java枚举)和方法来做或获得你想要的任何东西。

您可以定义StackElement以包含对几种类型之一的引用,然后还定义它可能包含的所有类型的所有方法;应用的是pass-throughs(如果类型是一个操作,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());
    }
  }
}