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
相关推荐
疯狂成瘾者1 小时前
LangChain4j ApacheTikaDocumentParser:多格式文档接入的统一入
java·langchain4j
2401_865439632 小时前
HTML函数在低温环境下启动慢吗_温度对硬件启动影响【方法】
jvm·数据库·python
庞轩px2 小时前
第三篇:泛型深度解析——类型擦除与通配符的奥秘
java·编译·泛型·类型擦除
菜择贰8 小时前
B树的性质和查找、插入、删除操作
数据结构·b树
LDR0068 小时前
接口焦虑终结者:LDR6020 芯片如何重新定义 Type-C 拓展坞与多设备互联时代
数据结构·经验分享·智能音箱
m0_377618238 小时前
Golang怎么连接MySQL数据库_Golang MySQL连接教程【总结】
jvm·数据库·python
LN花开富贵9 小时前
【ROS】鱼香ROS2学习笔记一
linux·笔记·python·学习·嵌入式·ros·agv
weixin_586061469 小时前
C#怎么通过反射获取类属性_C#如何动态读取元数据【进阶】
jvm·数据库·python
Jurio.9 小时前
本机开发 + 多机执行的极简远端运行工具
linux·git·python·github·远程工作
HoneyMoose9 小时前
Jenkins Cloudflare 部署提示错误
java·servlet·jenkins