题解 | #四则运算#
四则运算
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;
}
}