227. Basic Calculator 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.

Example 1:

Input: "3+2*2"
Output: 7

Example 2:

Input: " 3/2 "
Output: 1

Example 3:

Input: " 3+5 / 2 "
Output: 5

Note:

  • You may assume that the given expression is always valid.
  • Do not use the eval built-in library function.
class Solution {
    public int calculate(String s) {
        if(s==null || (s.length())==0) return 0;
        Stack<Integer> stack = new Stack<Integer>();
        char lastsign = '+';
        int num = 0;
        int le = s.length();
        
        for(int i = 0; i < le; i++){
            char c = s.charAt(i);
            
            if(Character.isDigit(c)) num = num * 10 + c - '0';
            if(!Character.isDigit(c) && c != ' ' || i == le - 1){
                switch (lastsign){
                    case '+': stack.push(num);
                        break;
                    case '-': stack.push(-num);
                        break;
                    case '*': stack.push(stack.pop() * num);
                        break;
                    case '/': stack.push(stack.pop() / num);
                        break;
                }
                lastsign = c;
                num = 0;
            }
        }
        int res = 0;
        for(int i: stack) res += i;
        return res;
    }
}

屌 https://leetcode.com/problems/basic-calculator-ii/discuss/63003/Share-my-java-solution

还有不用stack的方法:

public class Solution {
    public int calculate(String s) {
            if(s == null || s.length() == 0) {
                return 0;
            }

            s = s.trim();

            int prevNum = 0;
            int sum = 0;
            char prevOp = '+';

            for(int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if(c == ' ') continue;
                if(Character.isDigit(c)) {
                    int val = c - '0';
                    while(i + 1 < s.length() && Character.isDigit(s.charAt(i+1))) {
                        val = val * 10 + (s.charAt(i+1) - '0');
                        i++;
                    }
                    if (prevOp == '+') {
                        sum += prevNum;
                        prevNum = val;
                    } else if (prevOp == '-') {
                        sum += prevNum;
                        prevNum = -val;
                    } else if (prevOp == '*') {
                        prevNum = prevNum * val;
                    } else if (prevOp == '/') {
                        prevNum = prevNum/val;
                    }
                } else {
                    prevOp = c;
                }
            }

            sum += prevNum;
            return sum;
        }
}
原文地址:https://www.cnblogs.com/wentiliangkaihua/p/11909489.html