LeetCode 224. 基本计算器
题目描述
实现一个基本的计算器来计算一个简单的字符串表达式 s
的值。
示例1:
输入:s = "1 + 1"
输出:2
示例2:
输入:s = " 2-1 + 2 "
输出:3
示例3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
提示:
1 <= s.length <= 3 * 105
s
由数字、'+'
、'-'
、'('
、')'
、和' '
组成s
表示一个有效的表达式
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator
思路解析
这道题仅包含 +
和 -
两种运算符,不需要考虑运算符优先级的问题。
加入给定一个仅包含 +
和 -
,不含括号的式子,那么求解将变得十分简单,而加上括号之后,我们需要考虑的是,一个数字在整个式子里应该是被加上还是被减去?(即这个数字的真正符号是?)
对任意一个数字,我们假设该数字外面有 n
层括号包裹,那么这个数字的正负性应当这样考虑:记录每层括号前的一个运算符,以及该数字前的运算符,通过负负得正,判断该数字的真正符号。
继续思考,发现 +
并不改变一个数字的正负性,我们需要记录该数字的每层括号前的符号中,有几个 -
。
用一个栈记录每一层括号前的符号,代码如下:
代码实现
class Solution {
public:
int calculate(string s) {
stack<int> ops;
ops.push(1);
int ans = 0;
int i = 0;
int sign = 1;
while(i < s.length()) {
if(s[i] == ' ')
i++;
else if(s[i] == '+') {
sign = ops.top();
i++;
}
else if(s[i] == '-') {
sign = -ops.top();
i++;
}
else if(s[i] == '(') {
ops.push(sign);
i++;
}
else if(s[i] == ')') {
ops.pop();
i++;
}
else {
long num = 0;
while (i < s.length() && s[i] >= '0' && s[i] <= '9') {
num = num * 10 + s[i] - '0';
i++;
}
ans += sign * num;
}
}
return ans;
}
};
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析