在java中使用堆栈(LinkedList)实现表达式树,如下所示,但它有错误
我试图通过使用堆栈(LinkedList)实现表达式树,在编译它时出现以下错误在java中使用堆栈(LinkedList)实现表达式树,如下所示,但它有错误,java,algorithm,data-structures,linked-list,Java,Algorithm,Data Structures,Linked List,我试图通过使用堆栈(LinkedList)实现表达式树,在编译它时出现以下错误 Note: ExpressionTree.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 另外,我创建了以下测试类,但它再次出现以下错误 at java.util.LinkedList.checkElementIndex(LinkedList.java:555) at java.
Note: ExpressionTree.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
另外,我创建了以下测试类,但它再次出现以下错误
at java.util.LinkedList.checkElementIndex(LinkedList.java:555)
at java.util.LinkedList.get(LinkedList.java:476)
at ExpressionTree.<init>(ExpressionTree.java:27)
at Testfile.main(Testfile.java:4)
我哪里做错了?我想我使用了很多递归,所以可能是有错误,但我不知道在哪里。您的代码中几乎没有问题: 第一个问题是您不能使用==运算符在java中比较字符串,您需要使用类似.equals()的函数来比较两个字符串值。因此,此代码片段:
if (a == "0" || a == "1" || a == "2" || a == "3" ||a == "4" ||a == "5" ||
a == "6" ||a == "7" ||a == "8" ||a == "9")
将更改为:
if (a.equals("0")|| a.equals("1") ||a.equals("2") || a.equals("3") ||a.equals("4") ||a.equals("5") ||
a.equals("6") ||a.equals("7") ||a.equals("8") ||a.equals("9"))
这部分代码片段也是如此:
else if (a == "*" || a == "/" || a == "+" || a == "-")
在这个函数中也需要使用.equals函数
本部分中的eval
函数也存在相同的问题:
if (r.left!=null && r.right!=null){
if (r.getOperator() == "+"){
return eval(r.left) + eval(r.right);
} else if (r.operator == "*"){
return eval(r.left) * eval(r.right);
} else if (r.operator == "/"){
return eval(r.left) / eval(r.right);
} else {
return eval(r.left) - eval(r.right);
}
} else {
return r.getOperand();
}
第二个问题是输入表达式中的字符串(“34 2-5*”),其中一个字符串是34
,但它不满足此条件:
if (a == "0" || a == "1" || a == "2" || a == "3" ||a == "4" ||a == "5" ||
a == "6" ||a == "7" ||a == "8" ||a == "9")
因此,不必通过这种方式检查字符串是否为数字,您可以创建helper函数来执行类似操作,并调用相同的函数:
private boolean checkStringIsNumber(String s) {
boolean numeric = true;
try {
Integer num = Integer.parseInt(s);
} catch (NumberFormatException e) {
numeric = false;
}
return numeric;
}
第三期是这两行:
l.remove(l.size()-1);
l.remove(l.size()-2);
假设您的链接列表此时有两个节点。在l1之后,l2。在执行第一条语句之后
l.remove(l.size()-1);
l.remove(l.size()-2);
更新的链接列表将包含一个节点,即l1。现在如果你执行这个语句
l.remove(l.size()-1);
l.remove(l.size()-2);
它将抛出异常,因为链接列表大小现在是1,l.size()-2将返回-1,这是无效的索引
因此,我假设您希望删除最后2个节点,这样您就可以执行以下操作,而不是这两个语句:
l.remove(l.size()-1);
l.remove(l.size()-1);
因此,在解决所有这些问题后,ExpressionTree构造函数的更新代码是:
public ExpressionTree(String expression){
LinkedList l = new LinkedList();
String[] s = expression.split(" ");
int i=0;
for (String a:s){
if (checkStringIsNumber(a)){
int b = Integer.parseInt(a);
ExpressionNode e = new ExpressionNode();
e.operand(b);
l.add(e);
}
else if (a.equals("*") || a.equals("/") || a.equals("+") || a.equals("-")){
ExpressionNode e = new ExpressionNode();
e.operator(a);
e.right = (ExpressionNode)l.get(l.size()-1);
e.left = (ExpressionNode)l.get(l.size()-2);
l.remove(l.size()-1);
l.remove(l.size()-1);
l.add(e);
}
}
root = (ExpressionNode)l.get(0);
}
更新后的评估功能代码为:
public int eval(ExpressionNode r){
if (r.left!=null && r.right!=null){
if (r.getOperator().equals("+")){
return eval(r.left) + eval(r.right);
} else if (r.operator.equals("*")){
return eval(r.left) * eval(r.right);
} else if (r.operator.equals("/")){
return eval(r.left) / eval(r.right);
} else {
return eval(r.left) - eval(r.right);
}
} else {
return r.getOperand();
}
}
进行这些更改后,上面的表达式字符串工作正常,结果为160。您是否按照错误建议使用参数“-Xlint:unchecked”重新编译?很高兴这对您有所帮助