【LeetCode】224. 基本计算器

news2024/9/22 1:43:32

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;
        // 为了防止第一个数是负数,在最前面补0
        nums.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 开始后面的连续数字整体取出,加入nums
                    while(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. 【进阶补充】双栈解决通用「表达式计算」问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/909242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亥姆霍兹线圈在各行业中的作用

亥姆霍兹线圈是指两个相同的同轴圆形线圈&#xff0c;它们的圆心之间相隔一个相同的距离&#xff0c;并且电流的方向相反。亥姆霍兹线圈的作用非常广泛&#xff0c;不仅在物理学实验中得到广泛应用&#xff0c;而且在医学磁共振成像、电子学和通信领域中也有广泛的应用。 亥姆霍…

java学习——二叉树

二叉树的种类&#xff1a; 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 完全二叉树&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层…

代码随想录第27天|39. 组合总和,40.组合总和II,131.分割回文串

39. 组合总和 分析这道题的搜索过程如下&#xff1a; 因为这道题没有限制要搜索几层&#xff0c;所以可以一直搜索直到sumtarget或者sum>target就return 回溯三部曲 1.递归函数参数 本题还需要startIndex来控制for循环的起始位置&#xff0c;对于组合问题&#xff0c;什么…

净水器赛道迈向“柠檬市场”,易开得彰显自己的“价值主张”

作者 | 曾响铃 文 | 响铃说 一直以来&#xff0c;关于第一台净水器的诞生都有着不小的争论&#xff0c;有说是因为19世纪的一场霍乱&#xff0c;也有说是因为20世纪的水污染&#xff0c;但无论哪种说法&#xff0c;恰恰也说明净水产品在人类近代发展历程中都有着举足轻重的地…

从2023年世界机器人大会发现机器人新趋势

机器人零部件为何成2023年世界机器人大会关注热门&#xff1f; 在原先&#xff0c;机器人的三大核心零部件是控制系统中的控制器、驱动系统中的伺服电机和机械系统中的精密减速器。如今&#xff0c;机器人的主体框架结构已经落实&#xff0c;更多机器人已经开始深入到各类场景中…

题目——单身狗们!

目录 题目要求&#xff1a; 题目内容&#xff1a; 思路展开&#xff1a; 代码演示&#xff1a; 题目要求&#xff1a; 一个数组中只有两个数字是出现一次&#xff0c;其他所有数字都出现了两次编写一个函数找出这两个只出现一次的数字。 题目内容&#xff1a; 有数组的元素是…

分类预测 | MATLAB实现SCNGO-CNN-LSTM-Attention数据分类预测

分类预测 | MATLAB实现SCNGO-CNN-LSTM-Attention数据分类预测 目录 分类预测 | MATLAB实现SCNGO-CNN-LSTM-Attention数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.SCNGO-CNN-LSTM-Attention数据分类预测程序&#xff0c;改进算法&#xff0c;融合正余弦和…

谈一谈浏览器与Node.js中的JavaScript事件循环,宏任务与微任务机制

JavaScript中的异步代码 JavaScript是一个单线程非阻塞的脚本语言。这代表代码是执行在一个主线程上面的。但是JavaScript中有很多耗时的异步操作&#xff0c;例如AJAX&#xff0c;setTimeout等等&#xff1b;也有很多事件&#xff0c;例如用户触发的点击事件&#xff0c;鼠标…

javaScript:对函数的认识与应用

目录 一.前言 二.函数介绍 A.函数的分类 1.自定义函数 示例 2.匿名函数 声明匿名函数 计时器也是匿名函数 3.立即执行函数 解释 示例 B.函数的返回值 没有参数&#xff0c;没有返回值的函数 示例 没有参数&#xff0c;有返回值的函数 示例 有参数&#xff0c;有…

Transformer在医学影像中的应用综述-分割

文章目录 Transformers in Medical Imaging: A Survey摘要方法手工的方法基于卷积的方法基于Transformer的方法影像分割2D3D 多器官分割纯transformer混合Transformer单规模结构transformer在编码器中Transformer在编码器和解码器之间Transformer在编码器和解码器中Transformer…

【React】生命周期和钩子函数

概念 组件从被创建到挂载到页面中运行&#xff0c;再到组件不用时卸载的过程。 只有类组件才有生命周期。 分为三个阶段&#xff1a; 挂载阶段更新阶段销毁阶段 三个阶段 挂载阶段 钩子函数 - constructor 创建阶段触发 作用&#xff1a;创建数据 之前定义状态是简写&…

Datawhale Django 后端开发入门 Task05 DefaultRouter、自定义函数

一、DefaultRouter是Django REST framework中提供的一个路由器类&#xff0c;用于自动生成URL路由。路由器是将URL与视图函数或视图集关联起来的一种机制。Django REST framework的路由器通过简单的配置可以自动生成标准的URL路由&#xff0c;从而减少了手动编写URL路由的工作量…

五种消息模型简单说明

五种消息模型简单说明 RabbitMQ提供了6种消息模型&#xff0c;但是第6种其实是RPC&#xff0c;并不是MQ&#xff0c;因此不予学习。那么也就剩下5种。但是其实3、4、5这三种都属于订阅模型&#xff0c;只不过进行路由的方式不同。  我们通过一个demo工程来了解下RabbitMQ的…

代码随想录算法训练营(23/6/25)LeetCode 84.柱状图中最大的矩形

LeetCode 84.柱状图中最大的矩形 今天是算法训练营的打卡的最后一天&#xff0c;我开始觉得我能坚持下来&#xff0c;但因为个人原因&#xff0c;还有期末考试我花太多心思&#xff0c;打卡就一直断断续续&#xff0c;博客没怎么写&#xff0c;最终也写完了

ctfshow-web10 with rollup 绕过

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 基本方法&#xff0c;到处点一点&#xff0c;点到取消的时候&#xff0c;突然发现&#xff0c;可以下载一个文件&#xff1a; 看到这个源码&#xff0c;可以看到只能是通过满足下面的条件来拿到flag&#xff…

sql server 快速安装

目录标题 一、下载二、直接选择基本安装二、下载ssms&#xff08;数据库图形化操作页面&#xff09;三、开启sa账号认证&#xff08;一&#xff09;第一步&#xff1a;更改身份验证模式&#xff08;二&#xff09;第二步&#xff1a;启用 sa 登录 一、下载 下载地址&#xff1…

ModaHub魔搭社区:AI Agent在操作系统场景下的AgentBench基准测试

近日,来自清华大学、俄亥俄州立大学和加州大学伯克利分校的研究者设计了一个测试工具——AgentBench,用于评估LLM在多维度开放式生成环境中的推理能力和决策能力。研究者对25个LLM进行了全面评估,包括基于API的商业模型和开源模型。 他们发现,顶级商业LLM在复杂环境中表现出…

【leetcode 力扣刷题】链表基础知识 基础操作

链表基础知识 基础操作 链表基础操作链表基础知识插入节点删除节点查找节点 707. 设计链表实现&#xff1a;单向链表&#xff1a;实现&#xff1a;双向链表 链表基础操作 链表基础知识 在数据结构的学习过程中&#xff0c;我们知道线性表【一种数据组织、在内存中存储的形式】…

基于原生Servlet使用模板引擎Thymeleaf访问界面

我们常在Spring Boot项目中使用Thymeleaf模板引擎,今天突发奇想&#xff0c;尝试原生Servlet访问&#xff01; 说做就做 搭建完整的WEB项目 其中的大部分依赖都是后续报错 追加进来的 导入依赖 thymeleaf-3.0.11.RELEASE.jar 第一次访问 访问地址: http://localhost:8080…