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 };

 

posted @ 2022-02-22 23:21  乐乐章  阅读(48)  评论(0编辑  收藏  举报