中缀表达式计算结果.txt

UP 返回
public class LeetCode01 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        String str = scanner.nextLine().trim();
        String str = "2*(-2.11+(-1+3)*(-5.5))-7.6/(-11)";
        System.out.println(calFormula(str));
        //2*(2+(1+3)*5)-7/11
    }

    private static String calFormula(String formula) {
        Stack<Character> symbolStack = new Stack<>();
        Stack<String> afterStack = new Stack<>();
        boolean canNum = true;
        String num = "";
        for (int i = 0; i < formula.length(); i++) {
            char c = formula.charAt(i);
            if (isSymbol(c)) {
                if (c == '-' && canNum) {
                    num += c + "";
                    canNum = false;
                } else {
                    if (!"".equals(num)) {
                        afterStack.push(num);
                        num = "";
                    }
                    while (!highCome(c, symbolStack) && symbolStack.peek() != '(') {
                        afterStack.push(symbolStack.pop() + "");
                    }
                    symbolStack.push(c);
                    canNum = false;
                }
            } else if (c == '(') {
                if (!"".equals(num)) {
                    afterStack.push(num);
                    num = "";
                }
                symbolStack.push('(');
                canNum = true;
            } else if (c == ')') {
                if (!"".equals(num)) {
                    afterStack.push(num);
                    num = "";
                }
                while (symbolStack.size() != 0 && symbolStack.peek() != '(') {
                    afterStack.push(symbolStack.pop() + "");
                }
                if (symbolStack.size() != 0) {
                    symbolStack.pop();
                }
                canNum = false;
            } else {
                num += c + "";
                canNum = false;
            }
        }
        if (!"".equals(num)) {
            afterStack.push(num);
        }
        while (symbolStack.size() != 0) {
            afterStack.push(symbolStack.pop() + "");
        }
//        System.out.println(afterStack);
        return calStack(afterStack);
    }

    private static String calStack(Stack<String> afterStack) {
        Stack<String> calStack = new Stack<>();
        for (String s : afterStack) {
            if (isSymbol(s)) {
                String right = calStack.pop();
                String left = calStack.pop();
                String result = calSingle(left, right, s);
                calStack.push(result);
//                System.out.println(result);
            } else {
                calStack.push(s);
            }
        }
        return calStack.pop();
    }

    private static boolean highCome(char c, Stack<Character> symbolStack) {
        if (symbolStack.size() == 0) {
            return true;
        }
        if ((c == '*' || c == '/') && (symbolStack.peek() == '+' || symbolStack.peek() == '-')) {
            return true;
        }
        return false;
    }

    private static boolean isSymbol(char c) {
        return isSymbol(c + "");
    }

    private static boolean isSymbol(String c) {
        return "+".equals(c) || "-".equals(c) || "*".equals(c) || "/".equals(c);
    }

    private static String calSingle(String left, String right, String symbol) {
        Double a = Double.parseDouble(left);
        Double b = Double.parseDouble(right);
//        System.out.print(left + symbol + right + "=");
        switch (symbol) {
            case "+":
                return a + b + "";
            case "-":
                return a - b + "";
            case "*":
                return a * b + "";
            case "/":
                return a / b + "";
        }
        return "";
    }
}
DOWN 返回