题解 | #四则运算#

四则运算

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

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String exp = scanner.nextLine();
        System.out.println(calculator(exp));
    }

    public static int calculator(String s) {
        Stack<Integer> numbers = new Stack<Integer>();
        Stack<Character> symbols = new Stack<Character>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            // when the current character is a number
            if (c >= '0' && c <= '9') {
                StringBuilder sb = new StringBuilder();
                sb.append(c);
                i++;
                while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    sb.append(s.charAt(i));
                    i++;
                }
                i--;
                numbers.add(Integer.parseInt(sb.toString()));
            // when the current character is not a number
            } else {
                if (symbols.isEmpty()) {
                    symbols.add(c);
                } else {
                    if (c == '(' || c =='[' || c =='{') {
                        symbols.add('(');
                    } else if (c == ')' || c == ']' || c =='}') {
                        while (symbols.peek() != '(') {
                            evalOnce(numbers, symbols);
                        }
                        symbols.pop();
                    } else if (c == '*' || c =='/') {
                        while (!symbols.isEmpty() && symbols.peek() != '(' 
                            && symbols.peek() != '+' && symbols.peek() != '-') {
                            evalOnce(numbers, symbols);
                        }
                        symbols.add(c);
                    } else if (c == '+') {
                        while (!symbols.isEmpty() && symbols.peek() != '(') {
                            evalOnce(numbers, symbols);
                        }
                        symbols.add(c);
                    } else if (c == '-') {
                        if (!isNumber(s, i)) {
                            while (!symbols.isEmpty() && symbols.peek() != '(') {
                                evalOnce(numbers, symbols);
                            }
                            symbols.add(c);
                        } else {
                            numbers.add(-1);
                            symbols.add('*');
                        }
                    }
                }
            }
        }

        while (!symbols.isEmpty()) {
            evalOnce(numbers, symbols);
        }

        return numbers.pop();
    }

    public static boolean isNumber(String s, int i) {
        if (i == 0 || s.charAt(i-1) == '(' || s.charAt(i-1) == '[' ||s.charAt(i-1) == '{') {
            return true;
        } else {
            return false;
        }
    }

    public static void evalOnce(Stack<Integer> numbers, Stack<Character> symbols) {
        int b = numbers.pop();
        char c = symbols.pop();
        int a = numbers.pop();
        numbers.add(evalResult(a, c, b));
    }

    public static int evalResult(int a, char c, int b) {
        switch(c) {
            case '+':
                return a + b;
            case '-':
                return a - b;
            case '*':
                return a * b;
            case '/':
                return a / b;
        }

        return -1;
    }
}

全部评论

相关推荐

10-14 21:00
门头沟学院 Java
吃花椒的狸猫:这个人说的倒是实话,特别是小公司,一个实习生哪里来的那么多要求
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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