Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用堆栈计算后缀字符串表达式_Java_Stack_Expression - Fatal编程技术网

在Java中使用堆栈计算后缀字符串表达式

在Java中使用堆栈计算后缀字符串表达式,java,stack,expression,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));

我目前正在尝试用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;
}
public双重评估(){
StringStack stack=新的StringStack();
双结果=0;
for(int i=0;i
每当我尝试使用多个运算符(如5+5+5)计算表达式时,就会出现一个错误,表示堆栈为空。但是,只有一个运算符(如5+5)的表达式工作正常。我的代码哪里出错了

每当我尝试使用多个运算符(如5+5+5)计算表达式时,就会出现一个错误,表示堆栈为空

每当您尝试计算一个非合法后缀的表达式时,就会发生这种情况

但是,只有一个运算符(如5+5)的表达式工作正常

不,他们没有。您发布的代码为5+5提供了一个
EmptyStackException

我的代码哪里出错了

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

5+5也不是后缀表达式


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

我猜问题是需要将
结果
再次推入
堆栈中。堆栈是字符串堆栈。我应该再次从双精度转换为字符串吗?实际上,为什么要使用
string
堆栈?为什么不改为使用
Double
stack呢?作业需要使用字符串stack。我明白了,那么除了将Double转换回字符串,您别无选择。