LeetCode 227. 基本计算器 (Java)

Posted 爱若信若盼若

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 227. 基本计算器 (Java)相关的知识,希望对你有一定的参考价值。

0227. 基本计算器 Basic Calculator II(Medium)

##Stack##, ##String##

在没有括号的情况下,算术表达式情况较为简单

乘除优先于加减运算,因此考虑先进行乘除运算,运算结果放回原表达式中,原表达式变为一系列正整数加减后的值

遍历整个字符串s,用变量preSign记录每个数字前的操作符,当遍历完一个数字后,根据preSign决定计算计算方法

  • 加号:直接将该数加入栈中
  • 减号:取该数相反数加入栈中
  • 乘除号:取栈顶元素与当前数字进行相应操作后放入栈中

初始化时,将第一个遍历的数字的preSign符号看作加号;当遍历到一个运算符或遍历到字符串结尾时,都可以视作遍历完一个数字,此时应该进行相应计算操作,并更新preSign

遍历完整个字符串后,将栈中元素累加,即为该字符串表达式的值

时间复杂度: O ( n ) O(n) O(n)

class Solution {
    public int calculate(String s) {
        int res = 0, num = 0;
        Stack<Integer> sta = new Stack<Integer>();
        char preSign = '+';
        int len = s.length();

        for (int i = 0; i < len; i ++) {
            char ch = s.charAt(i);

            if (Character.isDigit(ch)) {
                num = num * 10 + ch - '0';
            }

            if ((!Character.isDigit(ch) && ch != ' ') || i == len - 1) {
                if (preSign == '+') {
                    sta.push(num);
                } else if (preSign == '-' ) {
                    sta.push(-1 * num);
                } else if (preSign == '*') {
                    sta.push(num * sta.pop());
                } else if (preSign == '/') {
                    sta.push(sta.pop() / num);
                }

                num = 0;
                preSign = ch;
            }
        }

        while (!sta.isEmpty()) {
            res += sta.pop();
        }

        return res;

    }
}

以上是关于LeetCode 227. 基本计算器 (Java)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 227. 基本计算器 II(Basic Calculator II)

LeetCode 227. 基本计算器 II

leetcode227基本计算器II (Medium)

leetcode-227-基本计算器②

Leetcode 227.基本计算器II

LeetCode227:基本计算器II