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


    Implement a basic calculator to evaluate a simple expression string.

    The expression string contains only non-negative integers, +-*/ operators and empty spaces . The integer division should truncate toward zero.

    You may assume that the given expression is always valid.

    Some examples:

    "3+2*2" = 7
    " 3/2 " = 1
    " 3+5 / 2 " = 5 

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

    Credits:
    Special thanks to @ts for adding this problem and creating all test cases.

    Java:

    public int calculate(String s) {
        int md=-1; // 0 is m, 1 is d
        int sign=1; // 1 is +, -1 is -
        int prev=0;
        int result=0;
     
        for(int i=0; i<s.length(); i++){
            char c = s.charAt(i);
            if(Character.isDigit(c)){
                int num = c-'0';
                while(++i<s.length() && Character.isDigit(s.charAt(i))){
                    num = num*10+s.charAt(i)-'0';
                }
                i--; // back to last digit of number
     
                if(md==0){
                    prev = prev * num;
                    md=-1;
                }else if(md==1){
                    prev = prev / num;
                    md=-1;
                }else{
                    prev = num;
                }
            }else if(c=='/'){
                md=1;
            }else if(c=='*'){
                md=0;
            }else if(c=='+'){
                result = result + sign*prev;
                sign=1;
            }else if(c=='-'){
                result = result + sign*prev;
                sign=-1;
            }
        }
     
        result = result + sign*prev;
        return result;
    }
    

    Python:

    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] == '+' or s[i] == '-':
                    while operators and 
                          (operators[-1] == '*' or operators[-1] == '/'):
                        self.compute(operands, operators)
                    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)
            elif op == '*':
                operands.append(left * right)
            elif op == '/':
                operands.append(left / right)
    

    C++:

    class Solution {
    public:
        int calculate(string s) {
            int res = 0, d = 0;
            char sign = '+';
            stack<int> nums;
            for (int i = 0; i < s.size(); ++i) {
                if (s[i] >= '0') {
                    d = d * 10 + s[i] - '0';
                }
                if ((s[i] < '0' && s[i] != ' ') || i == s.size() - 1) {
                    if (sign == '+') nums.push(d);
                    if (sign == '-') nums.push(-d);
                    if (sign == '*' || sign == '/') {
                        int tmp = sign == '*' ? nums.top() * d : nums.top() / d;
                        nums.pop();
                        nums.push(tmp);
                    }
                    sign = s[i];
                    d = 0;
                } 
            }
            while (!nums.empty()) {
                res += nums.top();
                nums.pop();
            }
            return res;
        }
    };  

    C++:  

    class Solution {
    public:
        int calculate(string s) {
            stack<int64_t> 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(stol(operand));
                        operand.clear();
                    }
                } else if (s[i] == ')' || s[i] == '*' ||
                           s[i] == '/') {
                    operators.emplace(s[i]);
                } else if (s[i] == '+' || s[i] == '-') {
                    while (!operators.empty() && (operators.top() == '*' ||
                           operators.top() == '/')) {
                         compute(operands, operators);
                    }
                    operators.emplace(s[i]);
                } else if (s[i] == '(') {
                    // operators at least one element, i.e. ')'.
                    while (operators.top() != ')') {
                        compute(operands, operators);
                    }
                    operators.pop();
                }
            }
            while (!operators.empty()) {
                compute(operands, operators);
            }
            return operands.top();
        }
    
        void compute(stack<int64_t>& operands, stack<char>& operators) {
            const int64_t left = operands.top();
            operands.pop();
            const int64_t 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);
            } else if (op == '*') {
                operands.emplace(left * right);
            } else if (op == '/') {
                operands.emplace(left / right);
            }
        }
    };
    

      

    类似题目:

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

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    Java并发编程:如何创建线程?
    Java并发编程:volatile关键字解析
    Java并发编程:深入剖析ThreadLocal
    Java并发编程:同步容器
    Java ConcurrentModificationException异常原因和解决方法
    Java并发编程:并发容器之ConcurrentHashMap
    Java并发编程:并发容器之CopyOnWriteArrayList
    Java并发编程:Callable、Future和FutureTask
    rest-framework频率组件
    rest-framework的权限组件
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8686407.html
Copyright © 2020-2023  润新知