题解 | #四则运算#

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

import java.math.BigDecimal;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static final Map<Character, Integer> PRIORITY_MAP = new
    HashMap<Character, Integer>() {
        {
            put('(', 0);
            put('+', 1);
            put('-', 1);
            put('*', 2);
            put('/', 2);
            put(')', 3);
        }
    };

    public static boolean priorityCompare(Character op1, Character op2) {
        return (PRIORITY_MAP.get(op1) - PRIORITY_MAP.get(op2)) <= 0;
    }

    public static BigDecimal compute(Character operator, BigDecimal num1,
                                     BigDecimal num2) {
        BigDecimal result = new BigDecimal(0);
        switch (operator) {
            case '+':
                result = num2.add(num1);
                break;
            case '-':
                result = num2.subtract(num1);
                break;
            case '*':
                result = num2.multiply(num1);
                break;
            case '/':
                result = num2.divide(num1);
                break;
            default:
                break;
        }
        return result;
    }

    public static void stackOperate(Deque opStack, Deque numStack) {
        Character operator = (Character) opStack.pop();
        BigDecimal num1 = (BigDecimal) numStack.pop();
        BigDecimal num2 = (BigDecimal) numStack.pop();
        BigDecimal result = compute(operator, num1, num2);
        numStack.push(result);
    }

    public static BigDecimal calculate(char[] exp) {
        Deque<Character> opStack = new ArrayDeque<>();
        Deque<BigDecimal> numStack = new ArrayDeque<>();
        StringBuilder numBuilder = new StringBuilder();
        for (int i = 0; i < exp.length; ++i) {
            Character c = exp[i];
            if ((c >= '0' && c <= '9') || c == '.' || (c == '-' && i == 0) || (c == '-' &&
                    exp[i - 1] == '(')) {
                numBuilder.append(c);
            } else {
                if (numBuilder.length() > 0) {
                    numStack.push(new BigDecimal(numBuilder.toString()));
                    numBuilder.delete(0, numBuilder.length());
                }
                if (opStack.isEmpty()) {
                    opStack.push(c);
                } else {
                    if (c == '(') {
                        opStack.push(c);
                    } else if (c == ')') {
                        while (opStack.peek() != '(') {
                            stackOperate(opStack, numStack);
                        }
                        opStack.pop();
                    } else {
                        do {
                            if (priorityCompare(c, opStack.peek())) {
                                stackOperate(opStack, numStack);
                                if (opStack.isEmpty()) {
                                    opStack.push(c);
                                    break;
                                }
                            } else {
                                opStack.push(c);
                                break;
                            }
                        } while (!opStack.isEmpty());
                    }
                }
            }
        }
        if (numBuilder.length() > 0) {
            numStack.push(new BigDecimal(numBuilder.toString()));
        }
        while (!opStack.isEmpty()) {
            stackOperate(opStack, numStack);
        }
        return numStack.pop();
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            char[] exp = in.nextLine().replace("[", "(").replace("{", "(").replace("]",
                         ")").replace("}", ")").toCharArray();
            System.out.println(calculate(exp));
        }
    }
}

全部评论

相关推荐

独角仙梦境:简历不要写和技术无关的内容
点赞 评论 收藏
分享
渴望wlb的牛油果很...:直说卡第一学历不就行了 非得拐弯抹角
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务