2016-02-28 90 views
-2

我正在尝试为Java中的计算器程序实现评估方法。在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)的表达式可以正常工作。我的代码在哪里出错?

+0

我猜测问题是你需要再次将'result'推入'stack' – radoh

+0

堆栈是一个String堆栈。我是否应该再次从双击转换回字符串? – kevinsangabriel

+0

其实,你为什么要用'String'堆栈呢?为什么不使用'Double'堆栈呢? – radoh

回答

0

当我尝试使用多个运算符(例如5 + 5 + 5)评估表达式时,发生错误,表明堆栈为空。

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

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

不,他们没有。您发布的代码给出5 + 5的EmptyStackException

我在哪里错了我的代码?

你不会在你的代码中出错。你的测试数据出错了。 5 + 5 + 5不是后缀表达式。这是一个中缀表达。正确的后缀是555 ++。

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

但是你有一个错误。您需要推送每个运算符的结果,并将stack.pop()的转换返回为double。并且您不需要检查!isOperator()else区块中的isOperator()