LeetCode:227. 基本计算器 II [Java实现]

实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。

示例 1:

输入: “3+2*2”
输出: 7
示例 2:

输入: ” 3/2 ”
输出: 1
示例 3:

输入: ” 3+5 / 2 ”
输出: 5

这是一个典型的栈的应用。上代码

s = s.replaceAll(" ", "");
        //if(!s.contains("+") &&!s.contains("-")&&!s.contains("*")&&!s.contains("+")){}
        char[] chars = s.toCharArray();
        int res = 0;
        Map tool = new HashMap<>();
        tool.put('+', 1);
        tool.put('-', 1);
        tool.put('*', 2);
        tool.put('/', 2);
        Stack numbers = new Stack<>();
        Stack signs = new Stack<>();
        int pos = 0;
        while (pos == 0 || !numbers.isEmpty()) {
            if (pos < chars.length && chars[pos] <= '9' && chars[pos] >= '0') {
                int num = 0;
                while (pos < chars.length && chars[pos] <= '9' && chars[pos] >= '0') {
                    num = (num * 10 + chars[pos] - '0');
                    pos++;
                }
                if (pos != chars.length)
                    pos--;
                numbers.push(num);
            } else {
                while (signs.size() != 0 && (pos == chars.length || tool.get(chars[pos]) <= tool.get(signs.peek()))) {
                    char sign = signs.pop();
                    int r = numbers.pop();
                    int l = numbers.pop();
                    res = caculate(l, r, sign);
                    numbers.push(res);
                }
                if (pos != chars.length)
                    signs.push(chars[pos]);
            }
            if (numbers.size() == 1 && signs.isEmpty() && pos == chars.length) break;
            if (pos != chars.length)
                pos++;
        }
        return numbers.pop();
    }

    private int caculate(int l, int r, char sign) {
        if (sign == '+')
            return l + r;
        else if (sign == '-')
            return l - r;
        else if (sign == '*')
            return l * r;
        else
            return l / r;
    }

你可能感兴趣的:(Java,算法,LeetCode)