227.基本计算器 II

实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格  。 整数除法仅保留整数部分。

示例 1:

输入: "3+2*2"
输出: 7
示例 2:

输入: " 3/2 "
输出: 1
示例 3:

输入: " 3+5 / 2 "
输出: 5

 

 

 

思路:

  • 对于 -3*5 看作:(-3) * 5,将 -3 存入栈中,前一个操作符为 * ,则从栈顶取出 -3。
  • 用一个变量,记录前一个操作符 ( + - * / ),是前一个,而不是当前操作符;
  • 当前一个操作符为 +,- 时,直接存入栈中;
  • 当前一个字符为 *,/ 时,取出栈顶元素,与当前的 number 操作后,压入栈中;
  • 累加栈中的元素,得到最终结果。

class Solution {
    public int calculate(String s) {
        Stack<Integer> stack = new Stack<>();
        int n = s.length(), number = 0;
        char sign = '+'; // 初始为正,记录前一个操作符
        for(int i = 0; i < n; i++){
            char c = s.charAt(i);
            if(c == ' ' && i != n-1) continue; //最后一个字符是空格时,不能跳过!
            if(c >= '0' && c <= '9') number = number * 10 + (c - '0');
            if(c == '-' || c == '+' || c == '*' || c == '/' || i == n-1){
                if(sign == '+') stack.push(number);
                else if(sign == '-') stack.push(-number);
                else if(sign == '*') stack.push(stack.pop() * number);
                else if(sign == '/') stack.push(stack.pop() / number);
                sign = c;
                number = 0;
            }
        }
        int res = 0;
        while(!stack.isEmpty()) res += stack.pop(); //累加栈中的数
        return res;
    }
}

 

posted @ 2020-10-21 20:39  星海寻梦233  阅读(100)  评论(0编辑  收藏  举报