当前位置: 首页 > news >正文

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

在这里插入图片描述

思路

在这里插入图片描述
在这里插入图片描述

class Solution:def calculate(self, s):stack = []pre_op = '+'num = 0for 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 = eachnum = 0return 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" 的执行流程。

输入

s = "3-5/2"

执行流程

  1. 初始化

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

    • 对每个字符进行遍历。
第一次循环 (i = 0, each = '3')
  • '3' 是数字:
    • num = 10 * 0 + 3num = 3
第二次循环 (i = 1, each = '-')
  • i 不是字符串的最后一个字符且 '-' 是操作符:
    • 因为 pre_op == '+'
      • stack.append(3)stack = [3]
    • 更新 pre_op = '-'
    • 重置 num = 0
第三次循环 (i = 2, each = '5')
  • '5' 是数字:
    • num = 10 * 0 + 5num = 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 + 2num = 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Kali Linux——网络安全的瑞士军刀
  • 登录页滑块验证图
  • Windows下编译安装PETSc
  • 简单介绍BTC的Layer2项目RGB
  • Java面试篇(JVM相关专题)
  • C#使用NPOI进行Excel和Word文件处理(二)
  • 房产中介小程序
  • C语言——结构体与共用体
  • Docker 网络代理配置及防火墙设置指南
  • 【云原生之kubernetes实战】在k8s环境下部署Note Mark笔记工具
  • 不仅能防沉迷游戏的防沉迷软件(Python)
  • 24/8/9算法笔记 决策树VS线性回归
  • 景联文科技:破解数据标注行业痛点,引领高质量AI数据服务
  • 二、Matlab图像处理基础
  • PDF隐写思路
  • 03Go 类型总结
  • CentOS7简单部署NFS
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • vue.js框架原理浅析
  • vue-cli3搭建项目
  • 百度小程序遇到的问题
  • 记一次删除Git记录中的大文件的过程
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 王永庆:技术创新改变教育未来
  • 我有几个粽子,和一个故事
  • 一天一个设计模式之JS实现——适配器模式
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​flutter 代码混淆
  • ​iOS实时查看App运行日志
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #LLM入门|Prompt#3.3_存储_Memory
  • #pragam once 和 #ifndef 预编译头
  • #微信小程序:微信小程序常见的配置传旨
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (一)Dubbo快速入门、介绍、使用
  • (轉)JSON.stringify 语法实例讲解
  • .NET Core 版本不支持的问题
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET 的程序集加载上下文
  • .NET 指南:抽象化实现的基类
  • @angular/cli项目构建--Dynamic.Form
  • @Bean有哪些属性
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [100天算法】-二叉树剪枝(day 48)
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [20181219]script使用小技巧.txt
  • [Algorithm][动态规划][两个数组的DP][正则表达式匹配][交错字符串][两个字符串的最小ASCII删除和][最长重复子数组]详细讲解
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算