【每日一题】栈系列(1) —— 基本计算器
写在前面:大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我
热爱AI、热爱分享、热爱开源
! 这博客是我对学习的一点总结与记录。如果您也对深度学习、机器视觉、算法、Python、C++
感兴趣,可以关注我的动态,我们一起学习,一起进步~
我的博客地址为:【AI 菌】的博客
我的Github项目地址是:【AI 菌】的Github
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一、基本计算器
(1) 题目描述
给你一个字符串表达式 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 表示一个有效的表达式
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
(2) 解题思路
总体思路:字符串中一共包含6种字符:{ +, -, (, ), 数字, 空格 }。在数学中,我们进行带括号的加减运算有两种方法:
- 先计算括号内,在计算括号外,从左往右依次计算
- 首先去掉所有的括号,且去括号后要变号,然后从左往右依次计算。
相比较而言,第二种方法更直接。我们选择第二种方法来实现。
如果要展开表达式中所有的括号,则得到的新表达式中,数字本身不会发生变化,只是每个数字前面的符号会发生变化。
因此,我们考虑使用一个取值为{−1,+1} 的整数 sign 代表「当前」的符号。根据括号表达式的性质,它的取值:
- 与字符串中当前位置的运算符有关
- 如果当前位置处于一系列括号之内,则也与这些括号前面的运算符有关:每当遇到一个以 -− 号开头的括号,则意味着此后的符号都要被「翻转」。
考虑到第二点,我们需要维护一个栈 stk,其中栈顶元素记录了当前位置所处的每个括号所 「共同形成」的符号。因此,数字加减的符号实际由两部分决定:
- 数字本身前面的+、-符号。这一部分,通过判断 ‘+’ 后者 ‘-’ ,可直接给sign取正或者负
- 数字外的一系列括号。这一部分,根一系列括号有关。如果括号前是+,则括号内部不需要变号,如果是负,则需要变号。因此括号前的符号特别重要,且括号是由作用范围的,以正括号开始,反括号结束,所以需要用栈stk来存储符号,且栈顶stk.top()表示的是当前的符号。
C++实现如下:
class Solution {
public: int calculate(string s) { stack<int> stk; stk.push(1); int sign = 1; int ans = 0; int n = s.length(); int i = 0; while (i < n) { if (s[i] == ' ') { i++; } else if (s[i] == '+') { sign = stk.top(); i++; } else if (s[i] == '-') { sign = -stk.top(); i++; } else if (s[i] == '(') { stk.push(sign); i++; } else if (s[i] == ')') { stk.pop(); i++; } else { long num = 0; while (i < n && s[i] >= '0' && s[i] <= '9') { num = num * 10 + s[i] - '0'; i++; } ans += sign * num; } } return ans; }
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
测试结果:
复杂度分析:
- 时间复杂度:O(n),其中 n 为字符串 s 的长度。
- 空间复杂度:O(n),其中 n 为字符串 s 的长度。空间复杂度主要取决于栈的空间,栈中的元素数量不超过 n。
由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!
推荐文章
文章来源: ai-wx.blog.csdn.net,作者:AI 菌,版权归原作者所有,如需转载,请联系作者。
原文链接:ai-wx.blog.csdn.net/article/details/114683244
- 点赞
- 收藏
- 关注作者
评论(0)