题解 | #四则运算#注释超详细

四则运算

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;
    }
}

全部评论

相关推荐

04-06 11:24
已编辑
太原学院 C++
真烦好烦真烦:感觉不太对劲,这种主动加微信的一般都是坑,要小心辨别
点赞 评论 收藏
分享
吴offer选手:学到了,下次面试也放张纸在电脑上,不然老是忘记要说哪几个点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务