力扣227题基本计算器II(Python实现)

思路


python 复制代码
class Solution:
    def calculate(self, s):
        stack = []
        pre_op = '+'
        num = 0
        for i, each in enumerate(s):
            if each.isdigit():
                num = 10 * num + int(each)
            if i == len(s) - 1 or each in '+-*/':
                if pre_op == '+':
                    stack.append(num)
                elif pre_op == '-':
                    stack.append(-num)
                elif pre_op == '*':
                    stack.append(stack.pop() * num)
                elif pre_op == '/':
                    top = stack.pop()
                    if top < 0:
                        stack.append(int(top / num))
                    else:
                        stack.append(top // num)
                pre_op = each
                num = 0
        return sum(stack)

作者:负雪明烛
链接:https://leetcode.cn/problems/basic-calculator-ii/solutions/648941/xian-cheng-chu-zai-jia-jian-yong-zhan-ba-hplr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这段代码定义了一个名为 Solution 的类,并实现了一个方法 calculate,用于计算给定数学表达式的值。以下是具体解释:

  1. 类与方法定义:

    • class Solution::定义一个名为 Solution 的类。
    • def calculate(self, s)::定义一个方法 calculate,接收一个字符串 s,表示数学表达式。
  2. 初始化:

    • stack = []:创建一个空列表 stack,用于存储计算结果。
    • pre_op = '+':初始化一个变量 pre_op,用于记录上一个操作符,默认为加号。
    • num = 0:用于存储当前正在处理的数字。
  3. 遍历字符串:

    • for i, each in enumerate(s)::遍历字符串 s 的每个字符。
    • if each.isdigit()::检查当前字符是否为数字。
      • num = 10 * num + int(each):构建当前数字(考虑多位数情况)。
  4. 操作符处理:

    • if i == len(s) - 1 or each in '+-*/'::判断是否到达字符串末尾或当前字符是一个操作符。
      • 根据 pre_op 的值决定如何处理 num:
        • 如果是加号 +,将 num 添加到 stack。
        • 如果是减号 -,将 -num 添加到 stack。
        • 如果是乘号 *,将栈顶元素与 num 相乘,再存回栈中。
        • 如果是除号 /,则处理除法(考虑整数除法的情况,负数处理特别)。
      • 更新 pre_op 为当前操作符,重置 num 为 0。
  5. 返回结果:

    • return sum(stack):计算栈中所有元素的和并返回,得到最终结果。

总结:这段代码通过栈实现了对基本四则运算的支持,能够处理带有不同操作符的数学表达式,并正确计算结果。

下面以 3-5/2为例解释具体执行流程

让我们详细分析如何通过 calculate 方法计算表达式 "3-5/2" 的执行流程。

输入

python 复制代码
s = "3-5/2"

执行流程

  1. 初始化

    • stack = []: 初始化堆栈为空。
    • pre_op = '+': 上一个操作符设为加号。
    • num = 0: 当前数字初始化为0。
  2. 遍历字符串

    • 对每个字符进行遍历。
第一次循环 (i = 0, each = '3')
  • '3' 是数字:
    • num = 10 * 0 + 3 → num = 3
第二次循环 (i = 1, each = '-')
  • i 不是字符串的最后一个字符且 '-' 是操作符:
    • 因为 pre_op == '+':
      • stack.append(3) → stack = [3]
    • 更新 pre_op = '-'
    • 重置 num = 0
第三次循环 (i = 2, each = '5')
  • '5' 是数字:
    • num = 10 * 0 + 5 → num = 5
第四次循环 (i = 3, each = '/')
  • i 不是字符串的最后一个字符且 '/' 是操作符:
    • 因为 pre_op == '-':
      • stack.append(-5) → stack = [3, -5]
    • 更新 pre_op = '/'
    • 重置 num = 0
第五次循环 (i = 4, each = '2')
  • '2' 是数字:
    • num = 10 * 0 + 2 → num = 2
第六次循环 (i = 5, each 是结束位置)
  • 由于到达字符串末尾:
    • 当前 pre_op 为 '/':
      • 执行除法,将栈顶元素与 num 相除:
      • top = stack.pop() → top = -5(从栈中移除 -5)
      • 因为 top < 0:
        • stack.append(int(top / num)) → stack.append(int(-5 / 2)) → stack.append(-2) (结果为 -2.5,取整为 -2)
        • stack 现在为 [3, -2]

结果计算

  • return sum(stack):
    • 计算 3 + (-2) = 1

最终结果

因此,表达式 "3-5/2" 的计算结果是 1。

相关推荐
神仙别闹4 小时前
基于Python实现自动化测试作业—图像增广方案
图像处理·python·计算机视觉
坊钰4 小时前
【LangGraph框架入门级】12. 人机交互:interrupt 中断与 Command 恢复
开发语言·数据库·python·人机交互·ai编程·langgraph
把我格子衫拿来4 小时前
四元数为什么突然变号?旋转表示、SLERP 与位姿插值避坑
python·机器人·坐标变换·四元数·slerp
Chasing__Dreams5 小时前
python杂识--24--Nuitak打包exe
开发语言·python
把我格子衫拿来5 小时前
RANSAC 粗配准:离群点很多时,怎样为 ICP 找到可信初值?
python·计算机视觉·三维重建·ransac·点云配准
Web3&Basketball5 小时前
决策模型vs GPT-5实测:便宜400倍
人工智能·python·gpt·大模型·ai落地·推理优化·决策模型
ljt27249606615 小时前
Python笔记(四)--模式匹配与正则
笔记·python
小羊没烦恼!5 小时前
T-SQL查询高级—SQL Server索引中的碎片和填充因子
开发语言·前端·javascript·数据库·后端·python·web安全
the局外人5 小时前
学会 SQLAlchemy 搭建 Python 与 MySQL 之间的数据访问桥梁 🚀
后端·python·sql
zh路西法5 小时前
【生成式模型入门】(四):Flow Matching——从速度场学习到生成路径
python·深度学习·神经网络·生成式模型·diffusionpolicy·flowmatching