实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。
题目链接:https://leetcode-cn.com/problems/basic-calculator/
示例 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, -1}的符号栈,栈顶元素就代表当前括号内所有符号的一个“基础符号”,也就是最终该符号后面的数字,到底是+还是-,是要看“基础符号”和该符号,来共同决定的。搞明白这个栈的作用,这题就简单了,右括号就出栈,左括号就入栈,实时维护当前sign就行了。
AC代码:
class Solution {
public:int calculate(string s) {stack<int> sk;sk.push(1);int i = 0,sign = 1;long long ans = 0;while(i < s.length()) {if(s[i] == '(') sk.push(sign);else if(s[i] == ')') sk.pop();else if(s[i] == '+') sign = (sk.top() == 1 ? 1 : -1);else if(s[i] == '-') sign = (sk.top() == 1 ? -1 : 1);else if(s[i] >= '0' && s[i] <= '9') {long long tmp = 0;while(i < s.length() && s[i]>='0'&&s[i]<='9') {tmp = tmp * 10 + s[i] - '0';i++;} i--;ans += sign * tmp;printf("%lld\n",ans);}i++;}return ans;}
};