If no one else guards the world, then I will come forward.
如果没有别人保卫这个世界,那么我将挺身而出。 给你一个字符串表达式s ,请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 示例 1: 示例 2: 示例 3: 提示: 1<=s.length<=3*10^5 s由整数和算符('+', '-', '*', '/') 组成,中间由一些空格隔开 s表示一个有效表达式 表达式中的所有整数都是非负整数,且在范围[0, 2^31 - 1]内 题目数据保证答案是一个32-bit整数
提示中说了,是一个有效的表达式,并且只有数字,空格和'+', '-', '*', '/'组成。我们知道算术运算式先算乘除后算加减。 所以我们可以把不能确定是否要计算的先加入到栈中,可以直接计算的先计算,然后再加入到栈中,我们随便举个例子画个图来看下
代码比较简单,我们来看下
1public int calculate(String s) { 2 //记录每个数字前面的符号,如果是乘法和除法就直接和前面的数字运算, 3 //然后在存放到栈中,如果是加法和减法直接存放到栈中 4 int preSign = '+'; 5 Stack<Integer> stack = new Stack<>(); 6 int length = s.length(); 7 for (int i = 0; i < length; i++) { 8 int ch = s.charAt(i); 9 if (ch == ' ')//过滤掉空格 10 continue; 11 //如果是数字 12 if (ch >= '0' && ch <= '9') { 13 //找到连续的数字字符串,把它转化为整数 14 int num = 0; 15 while (i < length && (ch = s.charAt(i)) >= '0' && ch <= '9') { 16 num = num * 10 + ch - '0'; 17 i++; 18 } 19 //这个是为了抵消上面for循环中的i++ 20 i--; 21 //乘法和除法,运算之后在存放到栈中。加法和减法直接存放到栈中 22 if (preSign == '*') { 23 stack.push(num * stack.pop()); 24 } else if (preSign == '/') { 25 stack.push(stack.pop() / num); 26 } else if (preSign == '+') { 27 stack.push(num); 28 } else if (preSign == '-') { 29 stack.push(-num); 30 } 31 } else {//记录前一个的符号 32 preSign = ch; 33 } 34 } 35 //把栈中的所有元素都取出来,计算他们的和 36 int res = 0; 37 while (!stack.empty()) { 38 res += stack.pop(); 39 } 40 return res; 41}
算术计算,优先级高的先计算,计算的结果入栈,优先级低的直接入栈,最后再统计栈中所有元素的和即可。
|