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
相关推荐
海宇数据几秒前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化残值评估网关
人工智能·python·架构·自动化
君顾19 分钟前
家政派单小程序源码开发实战:从零搭建到上线全流程指南
java·开发语言·家政派单
李可以量化9 分钟前
Tornado 如何增加网页操作(下)
python
流烟默10 分钟前
HTTP 连接管理技术梳理:JDK KeepAliveCache 机制与池化选型
java·网络协议·http
阿酷tony28 分钟前
视频专栏列表的防录屏水印和跑马灯效果(也可网站调用)
java·前端·音视频
zhangzeyuaaa31 分钟前
深入理解 pip install .:安装当前目录项目的正确姿势
人工智能·python·pip
洋不写bug43 分钟前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
牧羊人.3331 小时前
动手学深度学习 03 | 卷积神经网络实现手写数字识别
人工智能·深度学习·神经网络·算法·cnn
xcl09251 小时前
全民健身智慧管理系统实战指南:从架构设计到部署落地
java·spring boot
Bs_MoneyMagnet1 小时前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物