一、题目
1、审题
2、分析
给出字符串表示的包含有 +、-、( 、) 运算符以及空格、数字的整形运算,求出其结果。
二、解答
1、思路
循环遍历 S 中的字符 c:
①、当 c == 数字:将与其相邻的数字组合成整数。
②、当 c == ‘+’ : 前一个操作数输入完毕,开始新的运算,且为加法运算。
③、当 c == -: 前一个操作数输入完毕,开始新的运算,且为减法运算。
④、当 c == '(':将前边的运算结果 result 与操作符 sign 压入栈,开始新的运算,result、sign初始化。
⑤、当 c == ')': 结束当前() 内的运算,且将 Stack 中的栈顶两个元素出栈进行运算。
1 public int calculate3(String s) { 2 Stackstack = new Stack<>(); 3 int result = 0, number = 0; 4 int sign = 1; 5 for (int i = 0; i < s.length(); i++) { 6 char c = s.charAt(i); 7 if(Character.isDigit(c)) { 8 number = number * 10 + (c - '0'); 9 }10 else if(c == '+') {11 result += sign * number;12 number = 0;13 sign = 1;14 }15 else if(c == '-') {16 result += sign * number;17 number = 0;18 sign = -1;19 }20 // 开始一次新的运算 ①、先记录之前值 ②、从新开始计数,因为 ( 之前必有 +或-,所以 number = 0 是默认的21 else if(c == '(') { 22 stack.push(result);23 stack.push(sign);24 sign = 1;25 result = 0;26 }27 // 结束当前一次计数, ①、先结束当前()内的运算,②、加上()之前的一次运算。28 else if(c == ')') {29 result += sign * number;30 result *= stack.pop();31 result += stack.pop();32 number = 0;33 }34 }35 if(number != 0)36 result += sign * number;37 return result;38 }
优化: 每次将一个运算数单独处理完毕,与 ‘+’、‘-’ 号分开处理。
1 public int calculate(String s) { 2 Stackstack = new Stack<>(); 3 int len = s.length(); 4 int sign = 1, result = 0; 5 for (int i = 0; i < len; i++) { 6 char ch = s.charAt(i); 7 if(Character.isDigit(ch)) { 8 int sum = ch - '0'; 9 while(i+1 < len && Character.isDigit(s.charAt(i+1))) {10 sum = sum * 10 + s.charAt(i + 1) - '0';11 i++;12 }13 result += sign * sum;14 }15 else if(ch == '+')16 sign = 1;17 else if(ch == '-')18 sign = -1;19 else if(ch == '(') {20 stack.push(result);21 stack.push(sign);22 result = 0;23 sign = 1;24 }25 else if(ch == ')') {26 result *= stack.pop();27 result += stack.pop();28 }29 }30 return result;31 }