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; } }