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;
    }
}
相关推荐
C语言魔术师2 分钟前
【小游戏篇】三子棋游戏
前端·算法·游戏
自由自在的小Bird2 分钟前
简单排序算法
数据结构·算法·排序算法
王老师青少年编程6 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao6 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号
Coovally AI模型快速验证7 小时前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
可为测控8 小时前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
Milk夜雨8 小时前
头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
算法·贪心算法
BoBoo文睡不醒8 小时前
动态规划(DP)(细致讲解+例题分析)
算法·动态规划
apz_end9 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹10 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法