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

【数据结构-表达式解析】力扣227. 基本计算器 II

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

示例 1:
输入:s = “3+2*2”
输出:7
示例 2:

输入:s = " 3/2 "
输出:1
示例 3:

输入:s = " 3+5 / 2 "
输出:5

在这里插入图片描述

class Solution {
public:
    int calculate(string s) {
        stack<int> st;
        int i = 0;
        int n = s.size();
        char preSign = '+';
        while(i < n){
            if(s[i] == ' '){
                i++;
                continue;
            }

            long long num = 0;
            while(i < n && s[i] >= '0' && s[i] <= '9'){
                num = num * 10 + s[i] - '0';
                i++;
            }

            if (i == n || !isdigit(s[i])) {
                if(preSign == '+'){
                    st.push(num);
                }
                else if(preSign == '-'){
                    st.push(-num);
                }
                else if(preSign == '/'){
                    int t = st.top() / num;
                    st.pop();
                    st.push(t);
                }
                else if(preSign == '*'){
                    int t = st.top() * num;
                    st.pop();
                    st.push(t);
                }
                preSign = s[i];
                num = 0;
            }
            i++;
        }
        
        int res = 0;
        while(!st.empty()){
            res += st.top();
            st.pop();
        }

        return res;
    }
};

时间复杂度和空间复杂度双O(N)

这道题我们要解决的问题就是,我们需要先计算乘和除,那么我们就可以使用栈,当遇到符号是加号或者减号的时候,推入num或者-num到栈中,然后遇到乘号或者除号,就在栈顶上进行运算。

然后我们定义一个preSign来储存计算的符号,当遍历到加减乘除的时候,我们会将当前符号前面的num与栈顶的元素进行运算。举个例子输入:s = " 3+5 / 2 ",那么当我们遍历3的时候,会被储存在num中,当遇到加号的时候,就会将num给push到栈中,然后将preSign更新为加号,然后遍历到5,记录到num中,然后空格跳过,接下来遇到除号,我们这时候不进行除号运算,而是进行前面preSign的运算,preSign是加号,也就是继续将5推入栈中,运算完后将preSign更新为除号,然后遍历2,记录num=2,这时候经过while循环的i++,此时i=n,触发了if判断,此时preSign为除号,将栈顶的5除以当前的num值2。

最后我们只需要将栈中所有元素加起来即可,最终运算结果是5。


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

相关文章:

  • 创建可重用React组件的实用指南
  • 使用llama.cpp进行量化和部署
  • 开源宝藏:Smart-Admin 重复提交防护的 AOP 切面实现详解
  • Python + 深度学习从 0 到 1(00 / 99)
  • Kafka - 消费者程序仅消费一半分区消息的问题
  • SpringCloud SaToken整合微服务 集成Redis 网关路由权限拦截 服务间内部调用鉴权
  • SpringBoot中的restTemplate请求存在乱码问题的解决
  • 从熟练Python到入门学习C++(record 1)
  • 【数据结构OJ】【图论】图综合练习--拓扑排序
  • java八股-SpringCloud微服务-Eureka理论
  • Ubuntu 26.04 LTS 大升级:Qt 6 成为未来新引擎
  • 【Vue】Vue3.0(二十五)Vue3.0中的具名插槽 的概念和使用场景
  • 基于Qt智能物流管理系统的开发与应用
  • Ubuntu Linux使用前准备动作 安装vim编辑工具
  • 3D Gaussian Splatting在鱼眼相机中的应用与投影变换
  • java 增强型for循环 详解
  • 【漏洞复现】Wordpress Wholesale Market文件读取漏洞
  • 解决在Ubuntu 20.04中使用PyCharm时无法输入中文的问题
  • Linux性能优化之火焰图的起源
  • 【网络】网络抓包与协议分析
  • 【运维项目经历|048】Terraform 云基础设施自动化部署项目
  • 01.01、判定字符是否唯一
  • apache中的Worker 和 Prefork 之间的区别是什么?
  • 第一讲,Opencv计算机视觉基础之计算机视觉概述
  • 力扣——动态规划
  • Google 推出 Android 16 开发者预览版 1 - 新功能一览