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

【算法】字符串之227.基本计算器 -- 双栈的变形

目录

1、题目链接

2、分析

1、确定使用的数据结构

2、处理空格(细节!!!)

3、处理数字

4、遇到操作符

5、计算最终结果

3、代码实现


 

1、题目链接

227. 基本计算器 II - 力扣(LeetCode)

2、分析

1、确定使用的数据结构

使用栈stack(数组模拟栈)存储‘前序操作符’为“+”的中间结果,

字符 op 作为操作符,初始化为 '+' ,表示默认的操作符为加。

2、处理空格(细节!!!

直接跳过

3、处理数字

  • 当遇到字符是数字('0' 到 '9' 之间)时:
    • 定义一个临时变量 tmp 并初始化为 0 ,用于存储提取的数字。
    • 进入内层 while 循环,不断将数字字符转换为整数并累加到 tmp 中,直到遇到非数字字符。
    • 根据当前的操作符 op 进行相应的操作:
      • 如果 op 是 '+' ,将 tmp 压入栈中。
      • 如果 op 是 '-' ,将 -tmp 压入栈中。
      • 如果 op 是 '*' ,将栈顶元素乘以 tmp 。
      • 如果 op 是 '/' ,将栈顶元素除以 tmp 。

4、遇到操作符

将当前操作符更新为该操作符

5、计算最终结果

定义一个变量 ret 并初始化为 0 ,用于存储最终结果。

遍历栈中的元素,将它们相加存储到 ret 中。

3、代码实现

class Solution {
public:
    
    int calculate(string s) {
        vector<int> stack; //栈,只存放操作符为+的元素
        char op = '+';// 首元素的操作符默认为+
        int i = 0;

        while ( i < s.size())
        {
            //细节--空格直接跳过
            if (s[i] == ' ') i++;
            //遇到数字
            else if (s[i] <= '9' && s[i] >= '0')
            {
                int tmp = 0;

                //提取数字
                while ( i < s.size() && s[i] <= '9' && s[i] >= '0')
                {
                    tmp = tmp * 10 + ( s[i++] - '0' );
                }

                //对数字进行处理
                if (op == '+') stack.push_back(tmp);
                else if (op == '-') stack.push_back(-tmp);
                else if (op == '*') stack.back() *= tmp;
                else stack.back() /= tmp;
            }   
            else  //遇到操作符
            {
                op = s[i];
                i++;
            }           
        }

        //最后对栈处理,计算最终结果
        int ret = 0;
        for (auto a : stack) ret += a;

        return ret;
    }
};


http://www.kler.cn/a/513355.html

相关文章:

  • 我的创作纪念日,纪念我的第512天
  • 包文件分析器 Webpack Bundle Analyzer
  • 【JavaSE】(8) String 类
  • 阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化
  • 阳振坤:AI 大模型的基础是数据,AI越发达,数据库价值越大
  • 调试Hadoop源代码
  • docker安装rabbitmq并启动测试页面
  • Spring AI PromptChatMemoryAdvisor
  • Docker导入镜像
  • 动手学深度学习11.6. 动量法-笔记练习(PyTorch)
  • golang网络编程
  • 【leetcode100】验证二叉搜索树
  • 【力扣:新动计划,编程入门 —— 题解 ①】
  • 重学SpringBoot3-WebClient配置与使用详解
  • Spring Boot 中的 InitializingBean:Bean 初始化背后的故事
  • 2025年前端面试题汇总
  • 深度解析:CentOS 系统的硬件资源优化技巧
  • IoTDB Pipe 数据同步提示内存不足,如何调整
  • 亚博microros小车-原生ubuntu支持系列:2-摄像头控制
  • 小型分布式发电项目优化设计方案
  • SD换脸插件Reactor的安装教程
  • Kotlin 2.1.0 入门教程(三)
  • 使用插件SlideVerify实现滑块验证
  • 每日一题洛谷P2669 [NOIP2015 普及组] 金币c++
  • 使用 Babylon.js 开发时如何通过 CSS 实现 UI 自适应
  • 算法竞赛之差分进阶——等差数列差分 python