【问题标题】:In-fix Expression Evaluation - NoSuchElementFound ExceptionIn-fix 表达式评估 - NoSuchElementFound 异常
【发布时间】:2014-04-29 02:58:13
【问题描述】:

我的任务是计算从文​​件中读入的表达式,例如 (4-7)/2+6

分别表示最小值和最大值,优先级高于 / 和 *。

但是,我在尝试评估表达式时遇到 NoSuchElementFound 异常,指向我在评估方法结束时返回的堆栈。我假设这意味着堆栈是空的。我很难看到问题出在哪里。这是我的评估代码。重要的是,我已经实现了自己的堆栈类(两个字符串)并且没有使用泛型。

/**
 * Evaluates the expression and updates textArea appropriately
 */
private String evaluateLine()
{
    char token;
    String[] tokens = new String[expression[0].length()];
    for(int i = 0; i < expression[0].length(); i++)
    {
         token = expression[0].charAt(i);
         tokens[i] = String.valueOf(token);
    }

    OperatorStack operators = new OperatorStack();
    IntegerStack integers = new IntegerStack();

    for(int i = 0; i < tokens.length; i++)
    {
        if(isInteger(tokens[i]))
        {
            integers.push(tokens[i]);
        }
        else if(tokens[i] == "(")
        {
            operators.push(tokens[i]);
        }
        else if(tokens[i] == ")")
        {
            while(operators.top() != "(")
            {
                integers.push(applyOp(operators.pop(), integers.pop(), integers.pop()));
                operators.pop();
            }
        }
        else if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/" 
                || tokens[i] == "<" || tokens[i] == ">")
        {
            while(!operators.isEmpty() && hasPrecedence(tokens[i], operators.top(), operators.top()))
            {
                integers.push(applyOp(operators.pop(), integers.pop(), integers.pop()));
            }
            operators.push(tokens[i]);
        }
    }

    while(!operators.isEmpty())
    {
        integers.push(applyOp(operators.pop(), integers.pop(), integers.pop()));
    }

    return integers.pop();
}

public static boolean hasPrecedence(String op1, String op2, String op3)
{

    if(op2 == "(" || op2 == ")")
    {
        return false;
    }

    if((op1 == "<" || op1 == ">") && (op2 == "*" || op2 == "/") && (op3 == "+" || op3 == "-"))
    {
        return false;
    }
    else
    {
        return true;
    }
}

public static String applyOp(String op, String b, String a)
{
    switch (op)
    {
    case "+":
        return Integer.toString(Integer.parseInt(a) + Integer.parseInt(b));
    case "-":
        return Integer.toString(Integer.parseInt(a) - Integer.parseInt(b));
    case "*":
        return Integer.toString(Integer.parseInt(a) * Integer.parseInt(b));
    case "/":
        if(Integer.parseInt(b) == 0)
        {
            throw new
            UnsupportedOperationException("Cannot divide by 0");
        }
        return Integer.toString(Integer.parseInt(a) / Integer.parseInt(b));
    case "<":
        if(Integer.parseInt(a) < Integer.parseInt(b))
        {
            return b;
        }
        else if(Integer.parseInt(b) < Integer.parseInt(a))
        {
            return a;
        }
    case ">":
        if(Integer.parseInt(a) > Integer.parseInt(b))
        {
            return a;
        }
        else if(Integer.parseInt(b) > Integer.parseInt(a))
        {
            return b;
        }
    }

    return Integer.toString(0);

}

public boolean isInteger(String str)
{
    return str.matches("0123456789");
}

【问题讨论】:

    标签: java parsing stack expression evaluate


    【解决方案1】:

    很难找到确切的问题,因为您没有包含足够的代码来编译您的示例,但我注意到的一件事是您的 isInteger 方法不起作用。当我将输入运行到您的方法中时,它会为整数生成一个空堆栈。改用这个:

    public boolean isInteger(String str) {
        try {
            Integer.parseInt(str);
            return true;
        } catch (NumberFormatException ex) {
            return false;
        }
    }
    

    另外,我认为您正在尝试使用正则表达式来确定字符串是否包含整数。为此,您需要这样做:

    public boolean isInteger(String str) {
        return str.matches("[0-9]+");
    }
    

    使用isInteger 的这些实现中的任何一个,当我用Stack&lt;String&gt; 集合替换您的堆栈时,我都能让您的代码运行。希望有帮助。

    【讨论】:

    • 这帮我解决了问题,非常感谢!代码没有正确评估,但至少它运行顺利。再次感谢。
    • 很高兴我能帮上忙。愿意将我的答案标记为正确吗?
    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2023-01-03
    • 2019-05-24
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多