在java中使用堆栈(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.

我试图通过使用堆栈(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.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”重新编译?很高兴这对您有所帮助