【Leetcode】224. Basic Calculator

題目地址:

https://leetcode.com/problems/basic-calculator/

給定一箇中綴表達式,求其值。表達式中只含非負整數,加減乘除和左右小括號。

具體算法參考https://blog.csdn.net/qq_46105170/article/details/106209367。代碼如下:

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;

public class Solution {
    public int calculate(String s) {
        Deque<Integer> stack = new ArrayDeque<>();
        Deque<Character> ops = new ArrayDeque<>();
        Map<Character, Integer> prec = new HashMap<>();
        prec.put('(', 1);
        prec.put('+', 2);
        prec.put('-', 2);
        prec.put('*', 3);
        prec.put('/', 3);
    
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == ' ') {
                continue;
            }
            
            if (s.charAt(i) == '(') {
                ops.push('(');
            } else if (s.charAt(i) == ')') {
                while (ops.peek() != '(') {
                    oper(stack, ops.pop());
                }
                ops.pop();
            } else if (Character.isDigit(s.charAt(i))) {
                int j = i;
                int num = 0;
                while (j < s.length() && Character.isDigit(s.charAt(j))) {
                    num = num * 10 + (s.charAt(j) - '0');
                    j++;
                }
                stack.push(num);
                i = j - 1;
            } else {
                while (!ops.isEmpty() && prec.get(ops.peek()) >= prec.get(s.charAt(i))) {
                    oper(stack, ops.pop());
                }
                ops.push(s.charAt(i));
            }
        }
        
        while (stack.size() > 1) {
            oper(stack, ops.pop());
        }
        
        return stack.peek();
    }
    
    private void oper(Deque<Integer> stack, char ch) {
        int n2 = stack.pop(), n1 = stack.pop();
        stack.push(calc(n1, n2, ch));
    }
    
    private int calc(int a, int b, char ch) {
        switch (ch) {
            case '+': return a + b;
            case '-': return a - b;
            case '*': return a * b;
            case '/': return a / b;
        }
        
        return 0;
    }
}

時空複雜度O(n)O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章