首页 > 解决方案 > 逆波兰计算器没有返回正确的值

问题描述

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

理论上,如果字符串 "what" 设置为 "3 4 +" 它应该返回 7。但是当我运行它时它不会返回任何东西。

此外,如果字符串设置为“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;
    }
}

标签: javamathstacktry-catch

解决方案


您的代码有几个问题:

比较字符串的错误方法:

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

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

真的不应该那样做。改用equals

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

或者更好——而不是一堆if-elses 和equals调用,只需使用一个switch语句!

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");
}

您的方法将按预期工作。


推荐阅读