You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:38:10