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

算法训练营第二十一天|227. 基本计算器 II

题目链接:https://leetcode.cn/problems/basic-calculator-ii/description/ 优秀题解:https://leetcode.cn/problems/basic-calculator-ii/solutions/91271/chai-jie-fu-za-wen-ti-shi-xian-yi-ge-wan-zheng-ji-/

题目核心分析与思路

问题概述

实现一个计算器,计算一个包含非负整数、+-*/四种运算符和空格的字符串表达式的值。表达式是有效的,且除法为整数除法,向零截断

核心挑战

与之前单纯的“逆波兰表达式”或“相邻重复项消除”不同,本题引入了运算符优先级*/的优先级高于+-。我们不能简单地顺序计算,必须让高优先级的运算先发生。

为什么用栈?

栈可以帮助我们“暂停”计算。基本策略是:

  1. 遍历字符串,解析出数字和运算符。

  2. 遇到数字时,需要将其与前面可能存在的连续数字字符组合成完整的操作数。

  3. 关键:遇到运算符时,根据其类型决定立即计算还是暂缓计算:

    • 如果当前运算符是+-:由于优先级低,其左操作数的计算可能被后面的高优先级运算符影响,因此不能立即计算。我们将其连同符号一起压入栈中暂存。

    • 如果当前运算符是*/:由于优先级高,必须立即计算。此时它的左操作数就是上一个刚刚解析完的数字(或上一个乘除法的结果),右操作数是下一个即将解析的数字。计算后,用结果更新或替换栈中对应的值。

算法步骤(栈法)

  1. 初始化:一个栈stack<int>用于存储中间结果,一个变量num存储当前解析的数字,一个变量sign存储当前数字之前的运算符(初始为+,因为第一个数字是正的)。

  2. 遍历字符串

    • 遇到数字:更新num = num * 10 + (c - '0')

    • 遇到运算符或到达字符串末尾:说明一个完整的操作数num已解析完毕,此时需要根据它之前的运算符sign来决定如何处理它:

      • sign+:将num压入栈。

      • sign-:将-num压入栈。

      • sign*:弹出栈顶元素top,计算top * num,将结果压回栈。

      • sign/:弹出栈顶元素top,计算top / num,将结果压回栈。

    • 处理完毕后,重置num = 0,并将当前遇到的运算符c赋值给sign,作为下一个数字的前置运算符。

  3. 计算结果:遍历结束后,栈中所有元素(它们都代表带符号的数字,且高优先级的乘除已计算完毕)的和即为最终结果。

#include <stack> #include <string> using namespace std; class Solution { public: int calculate(string s) { stack<int> stk; long long num = 0; // 当前解析的数字 char sign = '+'; // 初始化符号,第一个数字默认为正 int n = s.size(); for (int i = 0; i < n; ++i) { char c = s[i]; if (isdigit(c)) { // 构建多位数 num = num * 10 + (c - '0'); } // 当遇到运算符 或 到达字符串末尾时,处理上一个运算符和数字 if ((!isdigit(c) && c != ' ') || i == n - 1) { switch (sign) { case '+': stk.push(num); break; case '-': stk.push(-num); break; case '*': { int top = stk.top(); stk.pop(); stk.push(top * num); break; } case '/': { int top = stk.top(); stk.pop(); stk.push(top / num); break; } } // 重置数字,并记录新的运算符 num = 0; sign = c; } } // 对栈中所有数字求和 int result = 0; while (!stk.empty()) { result += stk.top(); stk.pop(); } return result; } };
http://www.cnnetsun.cn/news/2161189.html

相关文章:

  • 批量操作版|淘宝多商品素材批量保存,高效省时间(适配运营/整理党)
  • PyTorch新手必踩的坑:为什么你的Tensor一调用.numpy()就报RuntimeError?
  • SAP Business Partner WebService 使用问题大全
  • YOLOv5模型精度上不去?试试把CBAM注意力模块‘塞’进Backbone(详细配置教程)
  • 第3篇:Vibe Coding时代:LangChain Tools 实战,给 LangGraph Agent 加上文件读写能力
  • 第4篇:Vibe Coding时代:LangChain RAG + LangGraph 实战,让 Coding Agent 读懂项目文档再写代码
  • 3分钟掌握:Windows电脑直接安装安卓应用的终极方案
  • 互联网大厂 Java 求职面试:从 Spring Boot 到微服务的技术问答
  • Codex CLI教程(特殊篇) | PM Skills 全量解析剖析
  • 如何在Apple Silicon Mac上获得主机级游戏体验:PlayCover按键映射终极指南
  • Postman测试EasyExcel导入功能:从本地文件路径到HTTP上传的完整避坑指南
  • 轻松掌握vue3-element-admin字体设置:从基础调整到深度定制全攻略
  • Android 开发问题:WRITE_EXTERNAL_STORAGE is deprecated (and is not granted) when targeting Android 13+.
  • VMware macOS解锁终极指南:5分钟搞定苹果系统虚拟机
  • 终极FF14副本动画跳过指南:3分钟告别冗长等待的ACT插件完整教程
  • 锐评 Kimi K2.6 vs Claude Opus 4.7:别卷了,大家都在抢 Agent 这张票
  • ROFL-Player终极指南:3个简单步骤掌握英雄联盟回放分析
  • 为Jellyfin媒体库注入Bangumi动漫元数据:构建智能中文番剧管理系统
  • 3分钟学会AI视频去水印:让您的视频内容焕然一新
  • 告别网盘限速烦恼!八大主流网盘直链下载助手终极指南
  • 为什么职场精英镀金,都盯上这所瑞士商学院
  • 2026年企业网盘推荐,从场景功能出发,打造高效协作的数字化解决方案
  • 快检C3:60分钟锁定补体级联“风暴眼”,精准狙击肾病/自免疾病
  • 体验Taotoken多模型聚合路由带来的高可用性与低延迟
  • Windows平台APK安装革命:告别模拟器的智能安卓应用部署方案
  • OBS实时字幕插件完整配置指南:5步实现专业直播体验
  • 3分钟破解视频水印难题:开源工具的智能修复方案
  • Translumo终极指南:如何用免费实时屏幕翻译工具打破语言障碍
  • UDS网络层时间参数N_As/N_Br/STmin详解:如何优化多帧传输效率与稳定性
  • 从豆瓣评分到淘宝推荐:深入聊聊皮尔森相关系数的优势、坑与替代方案