题解 | #四则运算#注释超详细
四则运算
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; } }