题解 | 表达式求值

#牛客创作赏金赛# #刷题我是认真的#

解题思路:

  1. 坑爹的题,这个真不是简单题型,各种判断,写了一遍,还是错误
  2. 小心 负号
  3. 只能求助AI了,以下是AI提供的解法
import java.util.Scanner;
import java.util.Stack;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        System.out.println(calculate(s));
    }

    public static int calculate(String s) {
        // 去掉所有空格
        s = s.replaceAll(" ", "");
        // 使用栈来存储数字和中间结果
        Stack<Integer> stack = new Stack<>();
        // 当前数字
        int num = 0;
        // 当前运算符
        char sign = '+';
        // 遍历字符串
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            // 如果是数字,解析完整的数字
            if (Character.isDigit(c)) {
                num = num * 10 + (c - '0');
            }
            // 如果是左括号,递归计算括号内的表达式
            if (c == '(') {
                int j = i, count = 0;
                for (; i < s.length(); i++) {
                    if (s.charAt(i) == '(') count++;
                    if (s.charAt(i) == ')') count--;
                    if (count == 0) break;
                }
                num = calculate(s.substring(j + 1, i));
            }
            // 如果是运算符或到达字符串末尾,处理栈中的内容
            if (!Character.isDigit(c) || i == s.length() - 1) {
                if (sign == '+') {
                    stack.push(num);
                } else if (sign == '-') {
                    stack.push(-num);
                } else if (sign == '*') {
                    stack.push(stack.pop() * num);
                } else if (sign == '/') {
                    stack.push(stack.pop() / num);
                }
                // 更新当前运算符
                sign = c;
                // 重置当前数字
                num = 0;
            }
        }
        // 计算栈中所有数字的和
        int result = 0;
        while (!stack.isEmpty()) {
            result += stack.pop();
        }
        return result;
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务