题解 | #四则运算#注释超详细
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.util.LinkedList;
import java.util.Scanner;
/**
* @ClassName Main
* @Description
* @Author 周其超
* @Create 2024/07/09 15:02
* @Version 1.0
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String input = in.nextLine();
System.out.println(operate(input));
}
private static int operate(String input) {
// 输入一个共享指针,也可以使用静态变量
return operate(input, new int[]{0});
}
private static int operate(String input, int[] pointer) {
// 正确的解析后,数字应该比操作符多一个,每计一个操作符,将两个数字计算为一个
// 操作符全部用完后,就只剩一个数字,就是需要返回的结果
LinkedList<Integer> numList = new LinkedList<>();
LinkedList<Character> operatorList = new LinkedList<>();
for (int i = 0; i < input.length(); i++) { // 解析
if (pointer[0] >= input.length()) {
break; // 如果已经解析完毕
}
char c = input.charAt(pointer[0]);
// 操作符 + * /
if (c == '+' || c == '*' || c == '/') {
operatorList.add(c);
++pointer[0];
} else if (c == '-') {
// 操作符 -
if (pointer[0] > 0 &&( input.charAt(pointer[0] - 1) >= '0' && input.charAt(pointer[0] - 1) <= '9'
|| (input.charAt(pointer[0] - 1) == ')' || input.charAt(pointer[0] - 1) == ']' || input.charAt(pointer[0] - 1) == '}'))) {
// 不是第一个而且前面是数字或括号,说明是减号
operatorList.add(c);
++pointer[0];
} else {
// 读取一个负数
++pointer[0];
numList.add(-getNum(input, pointer));
}
} else if (c == '(' || c == '[' || c == '{') {
++pointer[0];
numList.add(operate(input, pointer));
} else if (c == ')' || c == ']' || c == '}') {
++pointer[0];
break; // 结束解析
} else {
// 读取一个数字
numList.add(getNum(input, pointer));
}
}
// 运算 * / 先乘除
for (int i = 0; i < operatorList.size(); i++) {
Character c = operatorList.get(i);
if (c == '*') {
// 弹出对应两个位置的数字,运算后插入回对应的位置
numList.add(i, numList.remove(i) * numList.remove(i));
// 删除这个操作符,记得修改指针i
operatorList.remove(i--);
}
if (c == '/') {
numList.add(i, numList.remove(i) / numList.remove(i));
operatorList.remove(i--);
}
}
// 运算 + - 后加减
for (int i = 0; i < operatorList.size(); i++) {
Character c = operatorList.get(i);
if (c == '+') {
numList.add(i, numList.remove(i) + numList.remove(i));
operatorList.remove(i--);
}
if (c == '-') {
numList.add(i, numList.remove(i) - numList.remove(i));
operatorList.remove(i--);
}
}
return numList.get(0);
}
private static int getNum(String input, int[] pointer) {
char c = input.charAt(pointer[0]);
if (c < '0' || c > '9') {
// 说明是减号后面的括号,遇到括号计算为一个数字
return operate(input, pointer);
}
int result = 0;
// 读取数字
while (c >= '0' && c <= '9') {
result = result * 10 + c - '0';
pointer[0]++;
if (pointer[0] == input.length())
break;
else
c = input.charAt(pointer[0]);
}
return result;
}
}


