java - 逆波兰计算器没有返回正确的值
问题描述
以下代码适用于使用逆波兰表示法 (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;
}
}
解决方案
您的代码有几个问题:
比较字符串的错误方法:
在您的代码中,我们可以看到您使用==
to compare String
,例如:
if(next == "+") {
nextSymbol = Symbol.PLUS;
} else if ...
你真的不应该那样做。改用equals
:
if(next.equals("+")) {
nextSymbol = Symbol.PLUS;
} else if ...
或者更好——而不是一堆if-else
s 和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");
}
您的方法将按预期工作。
推荐阅读
- javascript - 获取两个路由器上的会话
- python-3.x - 如何从本地机器公开龙卷风 websocket
- powershell - 使用 Get content 或 Import-CSV 读取 csv 中第二行的第一列
- node.js - 无法使用 passportjs 和 cookie-session 将用户序列化到会话中
- r - dplyr::rename_at 给出错误“必须评估列位置或名称”
- three.js - ThreeJS:白色PNG图像加载为纹理,用作材质并渲染为平面具有灰色边缘
- python - 使用 word2vec 进行监督分类
- search - Visual Studio Code:在文件中搜索但排除文件夹
- c# - C# 标签不会在计时器上更新
- go - 检查来自 os.Remove 的错误消息