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

news/2024/11/25 1:02:36/

给你一个字符串表达式 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.ppmy.cn/news/1549681.html

相关文章

PHP将图片合成gif动图

一、要实现此功能首先需要安装一个扩展&#xff1a;imagick扩展 我这里php环境使用的docker&#xff0c;直接在Dockerfile文件中定义后&#xff0c;生成容器即可&#xff1a; # 安装Imagick PHP扩展 RUN pecl install imagick && \ docker-php-ext-enable imagick 其…

Spring Boot入门——Spring Boot项目的创建

一、网页版创建Spring Boot项目&#xff08;了解&#xff09; 1.进入网页https://start.spring.io​​​​​按如下方式选择 2.添加依赖 3.搜索web&#xff0c;添加Spring Wed依赖 4.点击下载代码 5. 使用idea打开下载好的文件即可 但实际上我们并不使用网页来创建Spring Boot项…

如何通过OpenSSL来创建自签名的CA证书?

通过创建自签名CA证书可以让我们在没有商业支持的情况下学习与研究PKI&#xff08;公钥基础设施&#xff09;和SSL/TLS技术&#xff0c;本文将详细介绍如何通过OpenSSL来创建自签名的CA证书。 1. 初衷&#xff1a;为什么需要创建自签名CA证书&#xff1f; 除了开篇引言中提到的…

【杂记】vLLM如何指定GPU单卡/多卡离线推理

写在前面 仅作个人学习与记录用。主要记录vLLM指定GPU单卡/多卡离线推理的方法。 vLLM官方文档中Environment Variables页面有对指定GPU方法的唯一描述&#xff1a; # used to control the visible devices in the distributed setting "CUDA_VISIBLE_DEVICES": la…

微软在Ignite 2024发布Copilot+新功能

&#x1f989; AI新闻 &#x1f680; 微软在Ignite 2024发布Copilot新功能 摘要&#xff1a;微软在Ignite 2024大会上宣布&#xff0c;Microsoft 365 Copilot将利用Copilot PC中的NPU本地运行AI模型&#xff0c;减少网络依赖。此功能将提升用户在Outlook和Word中的AI写作辅助…

Dockerfile复制目录进入镜像里

使用 ADD 复制目录进入镜像里 FROM ubuntu:22.04WORKDIR /rootRUN mkdir -p ./custom_nodes/ComfyUI-FluxTrainerADD ComfyUI-FluxTrainer ./custom_nodes/ComfyUI-FluxTrainerComfyUI-FluxTrainer 是一个目录&#xff0c;需要先 mkdir 创建这个目录&#xff0c;然后ADD 复制进…

php常用伪协议整理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理php常见的伪协议 php伪协议介绍 直观点&#xff0c;就是php可以识别的协议。 类似于我们访问网站的http协议&#xff0c;我们用浏览器访问我们自己本地文件的file协议等。 php可以识别这些协议&#xf…

C语言——break、continue、goto

目录 一、break 二、continue 1、在while循环中 2、在for循环中 三、go to 一、break 作用是终止循环&#xff0c;在循环内遇到break直接就跳出循环。 注&#xff1a; 一个break语句只能跳出一层循环。 代码演示&#xff1a; #include<stdio.h>void test01() {for (…