LeetCode-227-基本计算器Ⅱ

题目描述:

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

你可以假设给定的表达式总是有效的。所有中间结果将在 -231, 231 - 1 的范围内。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

解题思路:

使用栈:数字栈

思路:* / 直接算,+ - 后面再算,最后只剩 + -,再while(!numStack.isEmpty){计算加减就行}

1.1 遍历字符串,是数字直接放到数字栈

1.2 若遇到字符,若是 * /,则从栈中弹出一个num进行计算

若是 +,则直接压入栈中

若是 -,则变成相反数再直接压入栈中

1.3 最后遍历数字栈,将所有数字求和即为表达式的结果

java 复制代码
import java.util.Stack;

/**
 * @author: Arbicoral
 * @Description: 输入字符串 "3+2*2",求结果。
 */
public class KuaiShou {
    public static void main(String[] args) {
        String s = "33+23*2-33-53/5";
        System.out.println(s + " = " + calculate1(s));
        System.out.println(s + " = " + calculate2(s));
    }

    /**
     * 使用栈:数字栈
     * 思路:* / 直接算,+ - 后面再算,最后只剩 + -,再while(!numStack.isEmpty){计算加减就行}
     * 1.1 遍历字符串,是数字直接放到数字栈
     * 1.2 若遇到字符,若是 * /,则从栈中弹出一个num进行计算
            若是 +,则直接压入栈中
            若是 -,则变成相反数再直接压入栈中
     * 1.3 最后遍历数字栈,将所有数字求和即为表达式的结果
     * @return 表达式的结果
     */
    public static int calculate2(String expression) {
        int num = 0;
        int len = expression.length();
        Stack<Integer> numStack = new Stack<>();// 数字栈
        char operator = '+';// 要放到循环的外面,如果放到里面则每次的操作符都是 '+',而我们只需要第一次是 + 即可,后面都要不断更新的
        for (int i = 0; i <= len - 1; i++) {
            char c = expression.charAt(i);
            if (Character.isDigit(c)){
                num = num * 10 + (c - '0');
            }
            if (!Character.isDigit(c) && c != ' ' || i == len-1){
                switch (operator) {
                    case '+' -> numStack.push(num);
                    case '-' -> numStack.push(-num);
                    case '*' -> numStack.push(numStack.pop() * num);
                    case '/' -> numStack.push(numStack.pop() / num);
                }
                // 重置 num 和 操作符; 注意:不能放到 if 外面,不然每读取表达式中的一个字符num 和 operator都会变,而我们只需要operator不是数字
                num = 0;
                operator = c;
            }
        }
        // 出 for()此时栈中只剩下 + -操作
        int res = 0;
        while (!numStack.isEmpty()){
            res += numStack.pop();
        }
        return res;
    }


    /**
     * 思路:将字符串中的操作符全部变成 + ,即遇到 - 的则再取一个,然后变成对应的负数,遇到 * / 就直接计算,最后将栈中的所有数相加即可
     */
    public static int calculate1(String expression) {
        Stack<Integer> stack = new Stack<>();
        int num = 0;
        char operation = '+';
        for (int i = 0; i < expression.length(); i++) {
            char c = expression.charAt(i);
            if (Character.isDigit(c)) {
                num = num * 10 + (c - '0');
            }
            if (!Character.isDigit(c) && c != ' ' || i == expression.length() - 1) {
                if (operation == '+') {
                    stack.push(num);
                } else if (operation == '-') {
                    stack.push(-num);
                } else if (operation == '*') {
                    stack.push(stack.pop() * num);
                } else if (operation == '/') {
                    stack.push(stack.pop() / num);
                }
                num = 0;
                operation = c;
            }
        }
        int result = 0;
        while (!stack.isEmpty()) {
            result += stack.pop();
        }
        return result;
    }
}
相关推荐
地平线开发者10 小时前
J6B vio scenario sample
算法
BothSavage1 天前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn1 天前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽1 天前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说2 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰2 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术2 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六2 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程