题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.util.*; /** 搬照大佬代码 运算时,可以将括号内的数据看成一个整体 → 采用递归的方式解决问题 递归:子问题 和 整体问题是一样的,所以最初的运算符外也需要加一个() */ public class Main{ public static void main(String [] args){ Scanner in = new Scanner(System.in); String s = in.nextLine(); //为方便处理,将字符串中的中括号,大括号都换为小括号 s = s.replace('[','('); s = s.replace(']',')'); s = s.replace('{','('); s = s.replace('}',')'); //递归 - 统一计算逻辑, 最大的表达式外也加上括号 if(s.charAt(0) != '('){ s = '(' + s + ')'; } System.out.println(solve(s)); in.close(); } //递归求表达式的值 private static int solve(String s){ char[] arr = s.toCharArray(); //数组长度,使用len表示,以便方便取用 int len = arr.length; //用于存放数字 Stack<Integer> stack = new Stack<>(); //记录数字 int number = 0; //记录数字number的上一个运算符 // 默认为 + , 为+的时候就能包括住operator之前的数字不存在的情况 char operator = '+'; for(int i = 0; i < len; i++){ char c = arr[i]; //遇到左括号,找到与这个左括号响应的右括号的位置 //即左右括号数量相等时(计算:count记录括号数量, 遇到左括号就加1,遇到右括号就-1) //递归计算括号内的表达式 if(c == '('){ int j = i + 1; int count = 1; while(count > 0){ if(arr[j] == '('){ count++; } if(arr[j] == ')'){ count--; } j++; } //递归 获取 括号内表达式的值 number = solve(s.substring(i + 1, j - 1)); //注意j - 1位置是')'字符 i = j - 1; //防止arr[j]为空指针即j超过范围 + for循环中有i++,如果i = j, 那么就会超范围或者漏掉j位置的符号 }else if(Character.isDigit(c)){ //求多位数字如 12 number = number * 10 + c - '0'; } if(!Character.isDigit(c) || i == len - 1){ if(operator == '+'){ stack.push(number); //先放进去,最后再加 }else if(operator == '-'){ stack.push(-1 * number); //最后加的时候减去 }else if(operator == '*'){ stack.push(stack.pop() * number); }else if (operator == '/') { stack.push(stack.pop() / number); } //更新符号 operator = c; //刷新数字 number = 0; } } //栈中数字求和 int sum = 0; while(!stack.isEmpty()){ sum += stack.pop(); } return sum; } }