使用Java中的堆栈评估后缀字符串表达式

时间:2016-02-28 08:05:00

标签: java stack expression

我目前正在尝试用Java实现计算器程序的计算方法。

public double evaluate() {
StringStack stack = new StringStack();
double result = 0;
for (int i = 0; i < postfixTokens.size(); i++) {
    if (!isOperator(postfixTokens.get(i))) {
        stack.push(postfixTokens.get(i));   //pushes operands to the stack
    }else if (isOperator(postfixTokens.get(i))) {   
        double op1 = Double.parseDouble(stack.pop());   //pops two operands to perform an operation
        double op2 = Double.parseDouble(stack.pop());
        switch(postfixTokens.get(i)) {
            case "+": result = op1 + op2; break;
            case "-": result = op2 - op1; break;
            case "/": result = op2 / op1; break;
            case "*": result = op1 * op2; break;
            }
        }
    }
    return result;
}

每当我尝试使用多个运算符(例如5 + 5 + 5)计算表达式时,就会发生错误,说堆栈为空。只有一个运算符(如5 + 5)的表达式可以正常工作。我的代码在哪里出错?

1 个答案:

答案 0 :(得分:0)

  

每当我尝试使用多个运算符(例如5 + 5 + 5)计算表达式时,就会发生错误,说堆栈为空。

只要您尝试评估一个不合法的后缀的表达式,就会发生这种情况。

  

只有一个运算符(如5 + 5)的表达式可以正常工作。

不,他们不是。您发布的代码为5 + 5提供EmptyStackException

  

我的代码在哪里出错了?

你的代码中的错误&#39;。您的测试数据出了问题。 5 + 5 + 5不是后缀表达式。这是一个中缀表达。正确的后缀是555 ++。

5 + 5也不是后缀表达式。

但是你确实有一个错误。您需要推送每个运算符的结果,并将stack.pop()的转换返回到double。而且,您无需检查isOperator() else!isOperator()中的{{1}}。