美文网首页
力扣 227 基本计算器 II

力扣 227 基本计算器 II

作者: zhaojinhui | 来源:发表于2020-10-14 01:05 被阅读0次

题意:给定一个字符串计算式,计算该计算式的结果

思路:采用两个stack,一个用来记录出现的数字,一个用来记录出现的运算符,然后遍历字符串,计算出结果,具体见代码注释

思想:stack

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

class Solution {
    public int calculate(String s) {
        Stack<Long> stack1 = new Stack();
        Stack<Character> stack2 = new Stack();
        int cnt = 0;
        while(cnt<s.length()) {
            char cur = s.charAt(cnt);
            // 如果当前字符是' '跳过
            if(cur == ' ') {
                cnt++;
                continue;
            } else if(cur == '+' || cur == '-') {
               // 如果当前字符是+或-,那么弹出所有的符号stack,并对每一个符号进行计算,最后吧当前符号加入符号stack
               while(!stack2.isEmpty()) {
                    cal(stack1, stack2);
                }
                stack2.add(cur);
                cnt++;
            } else if(cur == '*' || cur == '/') {
                // 如果当前字符是*或/,那么弹出符号stack中的非*和/,并对每一个符号进行计算,最后吧当前符号加入符号stack
                while(!stack2.isEmpty() && (stack2.peek() == '*' || stack2.peek() == '/')) {
                    cal(stack1, stack2);
                }
                stack2.add(cur);
                cnt++;
            } else {
               // 计算当前的数字,并把它加入数字stack
                long temp = 0;
                while(cur >= '0' && cur <= '9') {
                    temp = temp * 10 + (cur - '0');
                    cnt++;
                    if(cnt < s.length())
                        cur = s.charAt(cnt);
                    else 
                        break;
                }
                stack1.add(temp);
            }
        }
        
        long res = 0;
        // 计算结果
        while(!stack2.isEmpty()) {
            cal(stack1, stack2);
        }
        return (int)((long)stack1.pop());
    }
    // 计算当前的结果
    void cal(Stack<Long> stack1, Stack<Character> stack2) {
        long num2 = stack1.pop();
        long num1 = stack1.pop();
        long temp = get(stack2.pop(), num1, num2);
        stack1.add(temp);
    }
    // 根据号的算式
    long get(char sign, long n1, long n2) {
        if(sign == '+') 
            return n1+n2;
        else if(sign == '-')
            return n1 - n2;
        else if(sign == '*')
            return n1*n2;
        else 
            return n1/n2;
    }
}

相关文章

网友评论

      本文标题:力扣 227 基本计算器 II

      本文链接:https://www.haomeiwen.com/subject/mdqipktx.html