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;
    }
}
相关推荐
jiao0000137 分钟前
数据结构——队列
c语言·数据结构·算法
迷迭所归处2 小时前
C++ —— 关于vector
开发语言·c++·算法
leon6252 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林2 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
Navigator_Z3 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
Aic山鱼3 小时前
【如何高效学习数据结构:构建编程的坚实基石】
数据结构·学习·算法
天玑y3 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
sjsjs113 小时前
【数据结构-一维差分】力扣1893. 检查是否区域内所有整数都被覆盖
数据结构·算法·leetcode
redcocal3 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
m0_571957583 小时前
Java | Leetcode Java题解之第406题根据身高重建队列
java·leetcode·题解