Java栈实现计算器时stack.peek().equals("(")失效问题求助
解决Java栈实现计算器时
stack.peek().equals("(")失效的问题 嘿,我懂你现在的烦躁——用Java栈开发计算器,结果stack.peek().equals("(")死活不生效,试了各种方法都没搞定对吧?别慌,咱们来拆解可能的问题,一步步解决它。
常见的几个坑和排查方向
- 元素类型不匹配:如果你栈里存的是
Character类型而非String,那用字符串"("去和Character对象做equals比较,结果肯定是false。比如你要是写了uRStack.push('('),存的就是Character,这时候要么改成uRStack.push("("),要么比较时用stack.peek().equals('(')。 - 栈为空时调用peek():栈空的时候调用
peek()会直接抛出EmptyStackException,如果你的代码没抛异常那大概率不是这个问题,但还是要养成好习惯——调用peek()前先判断!uRStack.isEmpty()。 - 括号字符不对:别小看这个细节!如果输入表达式里用了全角的“(”“)”,而非半角的
"("")",两者的Unicode值完全不同,equals肯定匹配不上,肉眼还很难分辨出来。
修正后的代码示例
结合你的代码片段,我调整了关键逻辑部分,你可以参考:
import java.util.Scanner; import java.util.Stack; public class URCalculator { public static Scanner scan = new Scanner(System.in); public static Stack<String> uRStack = new Stack<String>(); // 假设你还有存储数字的栈 public static Stack<String> numStack = new Stack<String>(); public static void main(String[] args) { System.out.println("请输入表达式:"); String expression = scan.nextLine(); for (int i = 0; i < expression.length(); i++) { char currentChar = expression.charAt(i); String currentStr = String.valueOf(currentChar); if (currentStr.equals("(")) { // 存入半角左括号的字符串 uRStack.push(currentStr); } else if (currentStr.equals(")")) { // 先判断栈非空,再循环弹出直到遇到左括号 while (!uRStack.isEmpty() && !uRStack.peek().equals("(")) { String operator = uRStack.pop(); // 这里添加你的运算符处理逻辑,比如从数字栈取数计算 // String num2 = numStack.pop(); // String num1 = numStack.pop(); // String result = calculate(num1, num2, operator); // numStack.push(result); } // 弹出左括号,注意要先判断栈非空 if (!uRStack.isEmpty()) { uRStack.pop(); } } // 其他逻辑:处理数字、运算符等 } } // 可选:添加计算方法示例 // private static String calculate(String num1, String num2, String operator) { // double n1 = Double.parseDouble(num1); // double n2 = Double.parseDouble(num2); // switch (operator) { // case "+": return String.valueOf(n1 + n2); // case "-": return String.valueOf(n1 - n2); // case "*": return String.valueOf(n1 * n2); // case "/": return String.valueOf(n1 / n2); // default: return "0"; // } // } }
快速排查小技巧
你可以在调用equals("(")之前加一行日志,打印栈顶元素的真实值和类型,这样就能一眼定位问题:
if (!uRStack.isEmpty()) { System.out.println("栈顶元素:" + uRStack.peek() + ",类型:" + uRStack.peek().getClass()); if (uRStack.peek().equals("(")) { // 你的逻辑 } }
比如如果打印出来类型是java.lang.Character,那就是存储的元素类型不对;如果打印的是全角括号“(”,那就是字符本身的问题。
内容的提问来源于stack exchange,提问作者Carmen Ferrone
相关产品推荐
相关产品推荐

