1. public class Solution {
    2. /**
    3. * 1:我们可以用一个栈,保存这些(进行乘除运算后的)整数的值。
    4. * 2:对于加减号后的数字,将其直接压入栈中;
    5. * 3:对于乘除号后的数字,可以直接与栈顶元素计算,并替换栈顶元素为计算后的结果。
    6. *
    7. * 记录录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。
    8. *
    9. * 加号:将数字压入栈;
    10. * 减号:将数字的相反数压入栈;
    11. * 乘除号:计算数字与栈顶元素,并将栈顶元素替换为计算结果。
    12. */
    13. // 3 + 2 * 2
    14. public int calculate(String s) {
    15. Integer number = 0;
    16. Stack<Integer> stack = new Stack<Integer>();
    17. Character preOpts = '+';
    18. for(int i = 0; i < s.length();i++){
    19. Character ch = s.charAt(i);
    20. if(Character.isDigit(ch)){
    21. number = number * 10 + s.charAt(i) - '0';
    22. }
    23. if(!Character.isDigit(ch) && ch != ' ' || i == s.length() - 1){
    24. switch (preOpts){
    25. case '+':
    26. stack.push(number);
    27. break;
    28. case '-':
    29. stack.push(-number);
    30. break;
    31. case '*':
    32. stack.push(stack.pop() * number);
    33. break;
    34. case '/':
    35. stack.push(stack.pop() / number);
    36. break;
    37. }
    38. number = 0;
    39. preOpts = ch;
    40. }
    41. }
    42. Integer res = 0;
    43. while (!stack.empty()){
    44. res += stack.pop();
    45. }
    46. return res;
    47. }
    48. }