我编写了一个代码,用于根据给定的字符串表达式创建二进制表达式树:
public ExprIF buildExpressionTree(String s)
{
for(int i = 0; i<s.length(); i++)
{
if(Character.isDigit(s.charAt(i)) || isOperator(s.charAt(i)))//containOp(s,i))
{
treeRoot = new Expr(s.charAt(i));
stack.push(treeRoot);
}
else if(s.charAt(i) == '(')
{
//do nothing
}
else
{
rightSubTree = stack.pop();
treeRoot = stack.pop();
leftSubTree = stack.pop();
treeRoot.setLeft(leftSubTree);
treeRoot.setRight(rightSubTree);
stack.push(treeRoot);
}
}
return stack.pop();
}
当我在纸上测试时,效果很好。问题是这个错误:
Exception in thread "main" java.util.EmptyStackException
at java.util.Stack.peek(Stack.java:102)
at java.util.Stack.pop(Stack.java:84)
at builder.TreeBuilder.buildExpressionTree(TreeBuilder.java:49)
at builder.TreeBuilder.build(TreeBuilder.java:29)
at Main.main(Main.java:12)
出现此错误的原因是什么?
答案 0 :(得分:0)
你的问题是你提供的输入字符串,它有空格,所以循环的第三次迭代得到一个空格字符并移动到最后else
语句。此时堆栈为空,因此您获得StackEmptyException
。尝试使用((1 + 2)* 3)输入字符串。
在你的逻辑中,当执行最后else
时,你必须有3个元素(两个数字和一个操作数)。
您的代码中的另一个问题是')'对于输入“((1 + 2)* 3), else
语句将会看到以下堆栈条目:
[1, +, 2]
[), *, 3]
你也需要跳过')',最好编写一个检查跳过字符的方法:
private boolean skip(char c)
{
return c==')' || c=='(' || c==' ';
}
现在在else if
更改逻辑:
else if(skip(s.charAt(i))
{
//do nothing, its a skip character
}
答案 1 :(得分:0)
对于您提供的输入,您的代码只是忘记处理空格。
解决方案1:添加以下代码以删除所有空格。
s = s.replaceAll("\\s", "");
解决方案2:替换
}
else
{
rightSubTree = stack.pop();
/* ... ... */
通过
} else if (c == ')'){
rightSubTree = stack.pop();
/* ... ... */