反向波兰计算器未返回正确的值

时间:2018-11-29 19:41:27

标签: java math stack try-catch

以下代码适用于使用逆波兰表示法(3 4 +-> 7)的简单计算器

理论上,如果将字符串“ what”设置为“ 3 4 +”,则应返回7。 但是,当我运行它时,它什么也不会返回。

如果String设置为“ 3 4”,则返回4,而不是错误。

如果我有Evaluate(“ 3 4 +”),该方法将卡在最后一个catch块上。

欢迎任何帮助!

计算器是一个接口:

public abstract interface Calculator {
    public abstract float evaluate(String what) 
        throws InvalidExpression, EmptyStack; 
}

这是我遇到问题的课程:

public class RevPolishCalc implements Calculator {

/*
 * NumStack is a facade, basically an ArrayList
 */
    private NumStack values =  new NumStack();
    float answer;

    public float evaluate(String what) throws InvalidExpression, EmptyStack {
        if((what == null) || (what.equals(""))) {
            throw new InvalidExpression("String is either empty or null");
        }

        try {
            Scanner input = new Scanner(what);
            while(input.hasNext()) {
                if(input.hasNextFloat()) {
                    values.push(input.nextFloat());
                } else {
                    String next = input.next();

                    //Symbol is an enum {PLUS, MINUS, TIMES, DIVIDE, INVALID}
                    Symbol nextSymbol;

                    if(next == "+") {
                        nextSymbol = Symbol.PLUS;
                    } else if (next == "-") {
                        nextSymbol = Symbol.MINUS;
                    } else if (next == "*") {
                        nextSymbol = Symbol.TIMES;
                    } else if(next == "/") {
                        nextSymbol = Symbol.DIVIDE;
                    } else {
                        nextSymbol = Symbol.INVALID;
                    }

                    switch(nextSymbol) {
                        case PLUS:
                            values.push(values.pop() + values.pop());
                        case MINUS:
                            values.push(-values.pop() + values.pop());
                        case TIMES:
                            values.push(values.pop() * values.pop());
                        case DIVIDE:
                            values.push(values.pop() / values.pop());
                        case INVALID:
                            throw new InvalidExpression("Invalid Value");
                        default:
                            throw new InvalidExpression("Unknown Value");
                    }   
                }
            }

            input.close();
            answer = values.pop();

        } catch (InvalidExpression e) {
            throw new InvalidExpression("");
        }
        return answer;
    }
}

2 个答案:

答案 0 :(得分:1)

您的代码有几个问题:

比较字符串的方式错误:

在您的代码中,我们可以看到您使用==来比较String,例如:

if(next == "+") {
    nextSymbol = Symbol.PLUS;
} else if ...

shouldn't really do that。请改用equals

if(next.equals("+")) {
    nextSymbol = Symbol.PLUS;
} else if ...

或更佳-只需使用if-else语句,而不是一堆equalsswitch调用!

switch(next) {
    case "+":
        nextSymbol = Symbol.PLUS;
        break;
    case "-":
        nextSymbol = Symbol.MINUS;
        break;
    case "*":
        nextSymbol = Symbol.TIMES;
        break;
    case "/":
        nextSymbol = Symbol.DIVIDE;
        break;
    default:
        nextSymbol = Symbol.INVALID;
        break;
}

错误使用switch语句:

让我们看一下您对下一个Symbol的处理方式:

switch(nextSymbol) {
    case PLUS:
        values.push(values.pop() + values.pop());
    case MINUS:
        values.push(-values.pop() + values.pop());
    case TIMES:
         values.push(values.pop() * values.pop());
    case DIVIDE:
         values.push(values.pop() / values.pop());
    case INVALID:
         throw new InvalidExpression("Invalid Value");
    default:
         throw new InvalidExpression("Unknown Value");
}

无法正常工作,因为在每个break之后,您缺少关键的case通话。只需像这样添加它们:

switch(nextSymbol) {
    case PLUS:
        values.push(values.pop() + values.pop());
        break;
    case MINUS:
        values.push(-values.pop() + values.pop());
        break;
    case TIMES:
        values.push(values.pop() * values.pop());
        break;
    case DIVIDE:
        values.push(values.pop() / values.pop());
        break;
    case INVALID:
        throw new InvalidExpression("Invalid Value");
    default:
        throw new InvalidExpression("Unknown Value");
}

您的方法将按预期工作。

答案 1 :(得分:0)

比较字符串时,请使用

if(next.equals("+")) {
                    nextSymbol = Symbol.PLUS;
                } else if (next.equals("-")) {
                    nextSymbol = Symbol.MINUS;
                } else if (next.equals("*")) {
                    nextSymbol = Symbol.TIMES;
                } else if(next.equals("/")) {
                    nextSymbol = Symbol.DIVIDE;
                } else {
                    nextSymbol = Symbol.INVALID;
                }