[LeetCode] 224. Basic Calculator 基本计算器

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

Note: Do not use the eval built-in library function.

 

Java:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
public int calculate(String s) {
    // delte white spaces
    s = s.replaceAll(" ", "");
  
    Stack<String> stack = new Stack<String>();
    char[] arr = s.toCharArray();
  
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == ' ')
            continue;
  
        if (arr[i] >= '0' && arr[i] <= '9') {
            sb.append(arr[i]);
  
            if (i == arr.length - 1) {
                stack.push(sb.toString());
            }
        } else {
            if (sb.length() > 0) {
                stack.push(sb.toString());
                sb = new StringBuilder();
            }
  
            if (arr[i] != ')') {
                stack.push(new String(new char[] { arr[i] }));
            } else {
                // when meet ')', pop and calculate
                ArrayList<String> t = new ArrayList<String>();
                while (!stack.isEmpty()) {
                    String top = stack.pop();
                    if (top.equals("(")) {
                        break;
                    } else {
                        t.add(0, top);
                    }
                }
  
                int temp = 0;
                if (t.size() == 1) {
                    temp = Integer.valueOf(t.get(0));
                } else {
                    for (int j = t.size() - 1; j > 0; j = j - 2) {
                        if (t.get(j - 1).equals("-")) {
                            temp += 0 - Integer.valueOf(t.get(j));
                        } else {
                            temp += Integer.valueOf(t.get(j));
                        }
                    }
                    temp += Integer.valueOf(t.get(0));
                }
                stack.push(String.valueOf(temp));
            }
        }
    }
  
    ArrayList<String> t = new ArrayList<String>();
    while (!stack.isEmpty()) {
        String elem = stack.pop();
        t.add(0, elem);
    }
  
    int temp = 0;
    for (int i = t.size() - 1; i > 0; i = i - 2) {
        if (t.get(i - 1).equals("-")) {
            temp += 0 - Integer.valueOf(t.get(i));
        } else {
            temp += Integer.valueOf(t.get(i));
        }
    }
    temp += Integer.valueOf(t.get(0));
  
    return temp;
}  

Python:

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
class Solution:
    # @param {string} s
    # @return {integer}
    def calculate(self, s):
        operands, operators = [], []
        operand = ""
        for i in reversed(xrange(len(s))):
            if s[i].isdigit():
                operand += s[i]
                if i == 0  or not s[i-1].isdigit():
                    operands.append(int(operand[::-1]))
                    operand = ""
            elif s[i] == ')' or s[i] == '+' or s[i] == '-':
                operators.append(s[i])
            elif s[i] == '(':
                while operators[-1] != ')':
                    self.compute(operands, operators)
                operators.pop()
                 
        while operators:
            self.compute(operands, operators)
             
        return operands[-1]
 
    def compute(self, operands, operators):
        left, right = operands.pop(), operands.pop()
        op = operators.pop()
        if op == '+':
            operands.append(left + right)
        elif op == '-':
            operands.append(left - right)

C++:

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
class Solution {
public:
    int calculate(string s) {
        int res = 0, sign = 1, n = s.size();
        stack<int> st;
        for (int i = 0; i < n; ++i) {
            char c = s[i];
            if (c >= '0') {
                int num = 0;
                while (i < n && s[i] >= '0') {
                    num = 10 * num + s[i++] - '0';
                }
                res += sign * num;
                --i;
            } else if (c == '+') {
                sign = 1;
            } else if (c == '-') {
                sign = -1;
            } else if (c == '(') {
                st.push(res);
                st.push(sign);
                res = 0;
                sign = 1;
            } else if (c == ')') {
                res *= st.top(); st.pop();
                res += st.top(); st.pop();
            }
        }
        return res;
    }
};  

C++:

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
38
39
40
41
42
43
class Solution2 {
public:
    int calculate(string s) {
        stack<int> operands;
        stack<char> operators;
        string operand;
        for (int i = s.length() - 1; i >= 0; --i) {
            if (isdigit(s[i])) {
                operand.push_back(s[i]);
                if (i == 0 || !isdigit(s[i - 1])) {
                    reverse(operand.begin(), operand.end());
                    operands.emplace(stoi(operand));
                    operand.clear();
                }
            } else if (s[i] == ')' || s[i] == '+' || s[i] == '-') {
                operators.emplace(s[i]);
            } else if (s[i] == '(') {
                while (operators.top() != ')') {
                    compute(operands, operators);
                }
                operators.pop();
            }
        }
        while (!operators.empty()) {
            compute(operands, operators);
        }
        return operands.top();
    }
 
    void compute(stack<int>& operands, stack<char>& operators) {
        const int left = operands.top();
        operands.pop();
        const int right = operands.top();
        operands.pop();
        const char op = operators.top();
        operators.pop();
        if (op == '+') {
            operands.emplace(left + right);
        } else if (op == '-') {
            operands.emplace(left - right);
        }
    }
};

    

类似题目:

[LeetCode] 227. Basic Calculator II 基本计算器 II

 

All LeetCode Questions List 题目汇总

 

posted @   轻风舞动  阅读(868)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示