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

【LeetCode】224. 基本计算器

224. 基本计算器(困难)

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

方法:双栈解法

思路

  • 我们可以使用两个栈 nums 和 ops

    • nums : 存放所有的数字
    • ops :存放所有的数字以外的操作,+/- 也看做是一种操作
  • 然后从前往后做,对遍历到的字符做分情况讨论:

    • 空格 : 跳过
    • ( : 直接加入 ops 中,等待与之匹配的 )
    • ) : 使用现有的 nums 和 ops 进行计算,直到遇到左边最近的一个左括号为止,计算结果放到 nums
    • 数字 : 从当前位置开始继续往后取,将整一个连续数字整体取出,加入 nums
    • +/- : 需要将操作放入 ops 中。在放入之前先把栈内可以算的都算掉,使用现有的 nums 和 ops 进行计算,直到没有操作或者遇到左括号,计算结果放到 nums
  • 一些细节:

    • 由于第一个数可能是负数,为了减少边界判断。一个小技巧是先往 nums 添加一个 0
    • 为防止 () 内出现的首个字符为运算符,将所有的空格去掉,并将 (- 替换为 (0-,(+ 替换为 (0+

代码

class Solution {
public:void replace(string &s) {int pos = s.find(" ");while (pos != -1) {s.replace(pos, 1, "");pos = s.find(" ");}}int calculate(string s) {// 存放所有数字stack<int> nums;// 为了防止第一个数是负数,在最前面补0nums.push(0);// 将所有空格去掉replace(s);// 存放所有操作符stack<char> ops;for(int i=0; i<s.size(); ++i) {char c = s[i];if(c == '(') ops.push(c);else if(c == ')'){// 计算到最近一个左括号为止while(!ops.empty()) {char op = ops.top();if(op != '(')   calc(nums, ops);else {ops.pop();break;}}}else {// 数字if(isdigit(c)) {int cur_num = 0;int j = i;// 将从 i 开始后面的连续数字整体取出,加入numswhile(j < s.size() && isdigit(s[j])) {cur_num = cur_num * 10 + (s[j++] - '0'); }nums.push(cur_num);i = j - 1;}// + -else {if(i > 0 && (s[i-1] == '(' || s[i-1] == '+' || s[i-1] == '-')) {nums.push(0);}// 有新操作要入栈时,把栈内可以算的算了while(!ops.empty() && ops.top() != '(') {calc(nums, ops);}ops.push(c);}}}while(!ops.empty()) calc(nums, ops);return nums.top();   }void calc(stack<int> &nums, stack<char> &ops) {if(nums.size() < 2 || ops.empty()) return ;int b = nums.top(); nums.pop();int a = nums.top(); nums.pop();char op = ops.top(); ops.pop();nums.push(op == '+' ? a+b : a-b); }
};

参考资料

  1. 【进阶补充】双栈解决通用「表达式计算」问题

相关文章:

【LeetCode】224. 基本计算器

224. 基本计算器&#xff08;困难&#xff09; 方法&#xff1a;双栈解法 思路 我们可以使用两个栈 nums 和 ops 。 nums &#xff1a; 存放所有的数字ops &#xff1a;存放所有的数字以外的操作&#xff0c;/- 也看做是一种操作 然后从前往后做&#xff0c;对遍历到的字符做…...

服务器数据恢复-EVA存储磁盘故障导致存储崩溃的数据恢复案例

EVA系列存储是一款以虚拟化存储为实现目的的中高端存储设备。EVA存储中的数据在EVA存储设备工作过程中会不断进行迁移&#xff0c;如果运行的任务比较复杂&#xff0c;EVA存储磁盘负载加重&#xff0c;很容易出现故障的。EVA存储通过大量磁盘的冗余空间和故障后rss冗余磁盘动态…...

【stylus】通过css简化搜索页面样式

发现stylus专门修改样式的插件后&#xff0c;发现之前写JS调整样式的方式是在太蠢了&#xff0c;不过有一些交互的东西还是得用JS&#xff0c;例如设置按钮来交互显示功能&#xff0c;或记录功能等。插件可以让简化网站变得简单&#xff0c;而且可以实时显示&#xff0c;真的不…...

【官方中文文档】Mybatis-Spring #使用 SqlSession

使用 SqlSession 在 MyBatis 中&#xff0c;你可以使用 SqlSessionFactory 来创建 SqlSession。 一旦你获得一个 session 之后&#xff0c;你可以使用它来执行映射了的语句&#xff0c;提交或回滚连接&#xff0c;最后&#xff0c;当不再需要它的时候&#xff0c;你可以关闭 s…...

Redis三种持久化方式详解

一、Redis持久性 Redis如何将数据写入磁盘 持久性是指将数据写入持久存储&#xff0c;如固态磁盘&#xff08;SSD&#xff09;。Redis提供了一系列持久性选项。其中包括&#xff1a; RDB&#xff08;快照&#xff09;&#xff1a;RDB持久性以指定的时间间隔执行数据集的时间点…...

17.2 【Linux】通过 systemctl 管理服务

systemd这个启动服务的机制&#xff0c;是通过一支名为systemctl的指令来处理的。跟以前 systemV 需要 service / chkconfig / setup / init 等指令来协助不同&#xff0c; systemd 就是仅有systemctl 这个指令来处理而已。 17.2.1 通过 systemctl 管理单一服务 &#xff08;s…...

第 7 章 排序算法(3)(选择排序)

7.6选择排序 7.6.1基本介绍 选择式排序也属于内部排序法&#xff0c;是从欲排序的数据中&#xff0c;按指定的规则选出某一元素&#xff0c;再依规定交换位置后达到排序的目的。 7.6.2选择排序思想: 选择排序&#xff08;select sorting&#xff09;也是一种简单的排序方法…...

Less文件可以做哪些复杂操作

在Less文件中&#xff0c;你可以进行许多复杂的操作来增强样式表的功能和灵活性。以下是一些常见的操作&#xff1a; 变量&#xff08;Variables&#xff09;&#xff1a;使用符号定义和使用变量&#xff0c;可以在整个样式表中重复使用相同的值&#xff0c;以便轻松修改和维护…...

HTML5岗位技能实训室建设方案

一 、系统概述 HTML5岗位技能技术是计算机类专业重要的核心课程&#xff0c;课程所包含的教学内容多&#xff0c;实践性强&#xff0c;并且相关技术更新快。传统的课堂讲授模式以教师为中心&#xff0c;学生被动式接收&#xff0c;难以调动学生学习的积极性和主动性。混合式教学…...

【Linux】GNOME图形化界面安装

Linux下具有多种图形化界面&#xff0c;每种图形化界面具有不同的功能&#xff0c;在这里我们安装的是GNOME。 1、 挂载yum源 挂载之前首先确保使用ISO映像文件 2.挂载之前先在/mnt下面创建一个cdrom目录用来作为挂载点目录 挂载完成之后那么就要去修改yum源了 Vi /etc/yum.r…...

大数据课程J3——Scala的类定义

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Scala的柯里化 Currying; ⚪ 掌握Scala的类定义; ⚪ 掌握Scala的样例类、option类; ⚪ 掌握Scala的隐式转换机制; 一、柯里化 Currying 柯里化(Currying)技术 Christopher St…...

Ribbon:使用Ribbon实现负载均衡

Ribbon实现的是实线走的 建立三个数据库 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.7.25-log : Database - db01 ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE*/;/*!40014 SET OLD_UNIQ…...

最新最全的~教你如何搭建高可用Lustre双机集群

1.搭建双机lustre高可用集群: 1.环境说明: 主机名系统挂载情况IP地址Lustre集群名内存mds001Centos7.9(共享磁盘)1个mgs,1个MDT,2个OST192.168.10.21/209.21global1Gmds002Centos7.9(共享磁盘)1个mgs,1个MDT,2个OST192.168.10.22/209.22global1GclientCentos7.9无19…...

深入浅出Pytorch函数——torch.nn.init.uniform_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

会员管理系统实战开发教程02-H5应用创建

低代码平台作为一个应用的快速生成工具&#xff0c;可以方便的进行一页多端的开发&#xff0c;可以在一个应用里生成三端的应用&#xff0c;也可以拆分成三个应用来制作。三端包括H5、小程序和PC管理后台。 上一篇我们介绍了PC管理后台的创建方法&#xff0c;本篇我们介绍一下…...

记一次由于整型参数错误导致的任意文件上传

当时误打误撞发现的&#xff0c;觉得挺奇葩的&#xff0c;记录下 一个正常的图片上传的点&#xff0c;文件类型白名单 但是比较巧的是当时刚对上面的id进行过注入测试&#xff0c;有一些遗留的测试 payload 没删&#xff0c;然后在测试上传的时候就发现.php的后缀可以上传了&a…...

spring之Spring Security - 实现身份验证与授权

Spring Security - 实现身份验证与授权 标题: Spring Security - 实现身份验证与授权摘要:引言:词汇解释:详细介绍:实现基本的身份验证与授权解释概念:代码示例:注意事项: 定制化认证与授权流程解释概念:代码示例:注意事项: 集成OAuth2认证解释概念:代码示例:注意事项: 总结:参…...

【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…...

【Linux】线程篇Ⅱ:

线程Ⅱ &#x1f517;接上篇【线程篇Ⅰ】五、线程库 和 线程 id六、同步与互斥 &#x1f517;接上篇【线程篇Ⅰ】 &#x1f449;【Linux】线程篇Ⅰ&#xff1a;线程和task_struct 执行流的理解、相关接口命令、线程异常、线程的私有和共享 五、线程库 和 线程 id 对于 Linux …...

浅尝OpenResty

文章目录 1. 写在前面2. 下载安装openresty2.1 下载Openresty2.2 设置nginx启动 3. 嵌入lua脚本4. 实践5. 小结 1. 写在前面 当一个域名中衍生出多个服务的时候&#xff0c;如果想要保持对外服务始终是一个域名&#xff0c;则需要通过nginx反向代理来实现。如果在转发的时候需…...

终极Vue 3日期时间选择器:如何构建企业级日期处理解决方案

终极Vue 3日期时间选择器&#xff1a;如何构建企业级日期处理解决方案 【免费下载链接】vue3-date-time-picker Datepicker component for Vue 3 项目地址: https://gitcode.com/gh_mirrors/vu/vue3-date-time-picker Vue3-DateTime-Picker是一个基于Vue 3 Composition …...

Midjourney批量生成工作流终极提速方案:从单图2分钟到百图并发17秒,实测数据驱动的6大优化节点

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney批量生成工作流的性能瓶颈全景图 在高并发图像生成场景中&#xff0c;Midjourney 的批量工作流常因 API 限流、提示词解析延迟、队列堆积及资源调度失衡而显著降速。其底层依赖 Discord 消息…...

高光谱图像分类避坑指南:Hughes现象、同物异谱,这些坑你踩过吗?

高光谱图像分类实战避坑手册&#xff1a;从Hughes现象到模型优化的深度解析 当你的高光谱分类模型在验证集上表现优异&#xff0c;却在真实场景中频频失误时&#xff0c;或许正遭遇着这个领域特有的"暗礁"。不同于常规RGB图像分类&#xff0c;高光谱数据特有的图谱合…...

第11章:C++ PGO与LTO优化

第11章:C++ PGO与LTO优化 本章定位:第四卷《实战卷》第三篇"性能优化"第 11 章。 在第 10 章"找热点"和第 11 章"改代码"之后,本章讨论"什么也不改、只调编译选项"能再榨出 5%-30% 的性能:LTO 让编译器看到全程序,PGO 让它看到运…...

TensorRT量化实战:手把手教你用Entropy Calibration校准激活值(附代码避坑)

TensorRT熵校准实战&#xff1a;从理论到代码的完整避坑指南 引言 在深度学习模型部署领域&#xff0c;量化技术已经成为减小模型体积、提升推理速度的关键手段。而作为量化过程中的核心环节&#xff0c;激活值校准直接决定了最终模型的精度表现。TensorRT提供的Entropy Calibr…...

面试官最爱问的iOS底层三剑客:RunLoop、KVO、Runtime实战避坑指南

面试官最爱问的iOS底层三剑客&#xff1a;RunLoop、KVO、Runtime实战避坑指南 在iOS开发的中高级面试中&#xff0c;RunLoop、KVO和Runtime这三个底层机制几乎成为必考题。但很多开发者仅仅停留在概念背诵层面&#xff0c;当面试官深入追问实现原理或实战场景时往往语塞。本文将…...

如何构建一个基于YOLOv8的智慧化工地管理系统,用于工地要素分割与检测

如何构建一个基于YOLOv8的智慧化工地管理系统&#xff0c;用于工地要素分割与检测。该系统将涵盖10大要素&#xff08;工人佩戴安全帽、不佩戴安全帽、预制构件、混凝土运输车、渣土车、搅拌车、挖掘机、压路车、推土车、装载车&#xff09; 文章目录以下文字仅供参考&#xff…...

Allegro中Route Keepout、Design Outline和Cutout到底怎么用?一张图讲清PCB布局中的‘禁区’设置

Allegro中三大边界工具实战指南&#xff1a;Route Keepout、Design Outline与Cutout的精准运用 在PCB设计领域&#xff0c;边界定义如同城市规划中的红线&#xff0c;既决定了板卡的物理形态&#xff0c;又影响着电气性能的发挥。Cadence Allegro作为行业标准工具&#xff0c;提…...

在Taotoken控制台中查看与分析API用量明细的实际操作

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Taotoken控制台中查看与分析API用量明细的实际操作 对于使用大模型API进行开发的团队或个人而言&#xff0c;清晰、准确地掌握AP…...

Silk-v3-decoder:打破即时通讯音频格式壁垒的专业解码方案

Silk-v3-decoder&#xff1a;打破即时通讯音频格式壁垒的专业解码方案 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion support. …...