Java栈实现计算器问题:相同逻辑在方法内失效排查
问题分析与修复方案
核心问题:字符串比较误用==而非equals()
你遇到的逻辑失效问题,根源是Java中字符串内容比较不能用==,必须用equals()方法。
为什么测试代码能运行?
在main方法的测试代码里,你用的是字符串字面量("+"、"/"),JVM会把这些字面量存入字符串常量池,所以opStack.peek() != "/"中的两个字符串指向同一个对象,==判断碰巧生效。
但在calculate方法中,运算符是从split()得到的字符串,这些是新创建的字符串对象,和字面量"/"、"*"不是同一个对象,此时==比较的是对象引用而非内容,导致你的条件判断完全失效——即使栈顶是"/",opStack.peek() != "/"也会返回true,所以代码会执行内部逻辑。
修复步骤
1. 替换所有字符串比较为equals()
把所有判断运算符的==、!=都改成equals()或!equals():
- 将
opStack.peek() != "/" && opStack.peek() != "*"改为!opStack.peek().equals("/") && !opStack.peek().equals("*") - 将
opStack.peek() == "*" || opStack.peek() == "/"改为opStack.peek().equals("*") || opStack.peek().equals("/") - Operate方法里的
if (op == "+")等全部替换为if (op.equals("+"))
2. 修复Operate方法的分支错误
你写了两个else if (op == "-"),除法的分支完全写错了,改成else if (op.equals("/")):
public static double Operate(String op, Stack<Double> stack, double d) { if (op.equals("+")) { double last = stack.pop(); double first = stack.pop(); d = first + last; } else if (op.equals("-")) { double last = stack.pop(); double first = stack.pop(); d = first - last; } else if (op.equals("*")) { double last = stack.pop(); double first = stack.pop(); d = first * last; } else if (op.equals("/")) { double last = stack.pop(); double first = stack.pop(); d = first / last; } return d; }
3. 其他逻辑优化(可选)
- 处理除法时要注意除数为0的情况,避免抛出运行时异常
- 循环结束后如果栈中还有未处理的运算符,需要补充计算逻辑(比如测试用例最后可能残留未执行的运算)
修复后的关键代码片段
以else分支中的判断为例,修复后:
else { opStack.push(arr[i]); if (opStack.size() == 2) { if (!opStack.peek().equals("/") && !opStack.peek().equals("*")) { op1 = opStack.pop(); if (!opStack.peek().equals("/") && !opStack.peek().equals("*")) { op2 = opStack.pop(); res = Operate(op2, numStack, res); numStack.push(res); opStack.push(op1); } else { opStack.push(op1); } } } }
内容的提问来源于stack exchange,提问作者Snub
相关产品推荐
相关产品推荐

