您好我正在使用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?
答案 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());
}
}
}