224. 基本计算器
难度困难
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()
。
示例 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)"
无效) - '-' 可以用作一元运算(即 "-1" 和
"-(2 + 3)"
是有效的) - 输入中不存在两个连续的操作符
- 每个数字和运行的计算将适合于一个有符号的 32位 整数
def calculate(self, s: str) -> int: def calculate_easy(s): stack_num = [] cur = 0 sign='+' while len(s)>0: ch = s.pop() if ch.isdigit(): cur = cur*10 + int(ch) if ch == '(': cur = calculate_easy(s) if (len(s) == 0) or (not ch.isdigit()): if sign == '+': stack_num.append(cur) elif sign == '-': stack_num.append(-cur) elif sign == '*': stack_num[-1] *= cur elif sign == "/": stack_num[-1] = int(stack_num[-1]/cur) cur = 0 sign = ch if ch == ')': break return sum(stack_num) # main s = list(s.replace(" ",""))[::-1] return calculate_easy(s)
1 class Solution { 2 public: 3 4 int findclose(string s ,int start) { 5 int level = 0; 6 for(int i = start;i < s.size(); i++) { 7 if (s[i]=='(') level++; 8 if (s[i]==')') { 9 level--; 10 if (level == 0) return i-start; 11 } 12 } 13 return 0; 14 } 15 int help(string s) { 16 int num = 0; 17 int top = 0; 18 char sign = '+'; 19 stack<int> stk; 20 for(int i =0;i < s.size();i++) { 21 char ch = s[i]; 22 if (isdigit(ch)) { 23 num = num*10 + (ch-'0'); 24 } 25 if (ch == '(') { 26 int right = findclose(s,i); 27 num = help(s.substr(i+1,right)); 28 i+=right; 29 } 30 if (!isdigit(ch) || i == s.size()-1) { 31 if (sign=='+') { 32 stk.push(num); 33 } else if (sign == '-') { 34 stk.push(-num); 35 } else if (sign == '*') { 36 top = stk.top();stk.pop(); 37 stk.push(num*top); 38 } else if (sign == '/') { 39 top = stk.top();stk.pop(); 40 stk.push(top/num); 41 } 42 sign = ch; 43 num = 0; 44 } 45 } 46 int res = 0; 47 while(!stk.empty()) { 48 res +=stk.top(); 49 stk.pop(); 50 } 51 return res; 52 } 53 int calculate(string s) { 54 string fs = "" ; 55 for (char ch : s) { 56 if (ch != ' ') { 57 fs+=ch; 58 } 59 } 60 return help(fs); 61 } 62 };