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;
    }
}
相关推荐
小赵起名困难户1 小时前
蓝桥杯备赛1-2合法日期
算法
shichaog1 小时前
腿足机器人之八- 腿足机器人动力学
算法·机器人
悄悄敲敲敲3 小时前
C++:dfs习题四则
c++·算法·深度优先
牛大了20235 小时前
[LeetCode力扣hot100]-二叉树相关手撕题
算法·leetcode·职场和发展
ll7788115 小时前
LeetCode每日精进:20.有效的括号
c语言·开发语言·算法·leetcode·职场和发展
德先生&赛先生5 小时前
LeetCode-633. 平方数之和
数据结构·算法·leetcode
mengyoufengyu7 小时前
算法12-贪心算法
python·算法·贪心算法
SharkWeek.7 小时前
【力扣Hot 100】链表4
算法·leetcode·链表
小白菜又菜8 小时前
Leetcode 518. Coin Change II
算法·leetcode
HUT_Tyne2658 小时前
力扣hot100第四天
算法·leetcode·职场和发展