LeetCode 224:基本计算器

一、题目描述

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

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

示例 1:

复制代码
输入:s = "1 + 1"
输出:2

示例 2:

复制代码
输入:s = " 2-1 + 2 "
输出:3

示例 3:

复制代码
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

提示:

  • 1 <= s.length <= 3 * 105
  • s 由数字、'+''-''('')'、和 ' ' 组成
  • s 表示一个有效的表达式
  • '+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
  • '-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
  • 输入中不存在两个连续的操作符
  • 每个数字和运行的计算将适合于一个有符号的 32位 整数

二、思路分析

三、代码参考

1、Java

java 复制代码
class Solution {
    public int calculate(String s) {
        // 创建栈空间
        Stack<Integer> stack = new Stack<>();
        // 用来表示正负号,1 为 + , -1 位 - ,默认为正数
        int sign = 1;
        // 用来记录运算结果
        int result = 0;
        // 循环遍历字符串
        for(int i = 0; i < s.length(); i++){
            // 获取当前字符
            char str = s.charAt(i);     
            // 判断是否为数字类型
            if(Character.isDigit(str)){
                // 通过 - '0' 这个操作把字符转换为整数
                int value = str - '0';
                // 查看后面是否字符仍为数字,即数字是否为多位数,如果是需要拼接好数字
                while(i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))){
                    // i 向后移动
                    i++;
                    // 数字拼接,如
                    // 12 = 1 * 10 + 2
                    // 123 = 12 * 10 + 3
                    value = value * 10 + s.charAt(i) - '0';
                }
                // 把获取到的结果赋值给 result
                result = result + sign * value;

            }       
            // 如果是 + 符号,则 sign 为 1
            else if(str == '+'){
                sign = 1;
            }
            // 如果是 - 符号,则 sign 为 -1
            else if(str == '-'){
                sign = -1;
            }
            // 判断是否是 '('
            else if(str == '('){
                // 先把在遇到 '(' 之前的结果放入到栈中
                stack.push(result);
                // 然后 result 结果置空,为了等下计算括号里面的结果
                result = 0;
                // 再把左括号前面的符号放入到栈中
                stack.push(sign);
                // 回归默认值
                sign = 1;
                
            }
            // 判断是否为 ')'
            else if(str == ')'){
                // 取出栈顶的元素,此时的栈顶元素是 '(' 前的符号
                int symbol = stack.pop();
                // 再获取栈顶元素,此时的栈顶元素是 '(' 前的运算结果
                int stackResult = stack.pop();
                // 计算结果并将结果赋值给 result
                result = stackResult + symbol * result;

            }
        }

        // 返回结果
        return result;

    }
}

2、Python

python 复制代码
class Solution(object):
    def calculate(self, s):
        # 创建栈空间
        stack = list()
        # 用来表示正负号,1 为 + , -1 位 - ,默认为正数
        sign = 1
        # 用来记录运算结果
        result = 0
        # 初始化 i 
        i = 0
        # 循环遍历字符串
        while i < len(s):
            # 获取当前字符
            str = s[i]
            # ' ' 空字符不需要做处理,下一个就好
            if str == ' ' :
                i += 1
            # 判断是否为数字类型
            elif str.isdigit() :
                # 把字符类型转换成数字类型
                value = ord(s[i]) - ord('0')

                # 查看后面是否字符仍为数字,即数字是否为多位数,如果是需要拼接好数字
                while i + 1 < len(s) and s[i + 1].isdigit():
                    # i 向后移动
                    i += 1
                    # 数字拼接,如
                    # 12 = 1 * 10 + 2
                    # 123 = 12 * 10 + 3
                    value = value * 10 + ord(s[i]) - ord('0')
                    
                # 把获取到的结果赋值给 result
                result += value * sign
                i += 1

            # 如果是 + 符号,则 sign 为 1
            elif str == '+' :
                sign = 1
                i += 1

            # 如果是 - 符号,则 sign 为 -1
            elif str == '-' :
                sign = -1
                i += 1

            # 判断是否是 '('
            elif str == '(' :
                # 先把在遇到 '(' 之前的结果放入到栈中
                stack.append(result)
                # 然后 result 结果置空,为了等下计算括号里面的结果
                result = 0
                # 再把左括号前面的符号放入到栈中
                stack.append(sign)
                # 回归默认值
                sign = 1
                i += 1

            # 判断是否为 ')'
            elif str == ')' :
                # 取出栈顶的元素,此时的栈顶元素是 '(' 前的符号
                symbol = stack.pop()
                # 再获取栈顶元素,此时的栈顶元素是 '(' 前的运算结果
                stackResult = stack.pop()
                # 计算结果并将结果赋值给 result
                result = stackResult +  symbol * result 
                i += 1

        # 返回结果
        return result
相关推荐
小瑞瑞acd4 小时前
【小瑞瑞精讲】卷积神经网络(CNN):从入门到精通,计算机如何“看”懂世界?
人工智能·python·深度学习·神经网络·机器学习
爬山算法4 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
java·压力测试·hibernate
仟濹4 小时前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先
驭渊的小故事4 小时前
简单模板笔记
数据结构·笔记·算法
火车叼位4 小时前
也许你不需要创建.venv, 此规范使python脚本自备依赖
python
YuTaoShao4 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
消失的旧时光-19434 小时前
第十四课:Redis 在后端到底扮演什么角色?——缓存模型全景图
java·redis·缓存
BD_Marathon5 小时前
设计模式——依赖倒转原则
java·开发语言·设计模式
火车叼位5 小时前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
VT.馒头5 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展