堆栈计算算术表达式

2020-05-08  本文已影响0人  极速魔法

双堆栈计算算术表达式

package algorithm;

import java.util.Stack;

public class TwoStacks {

    public static void main(String[] args) {
        String s = "(1+((2+3)*(4*5)))";
        Double res = calculate(s);
        System.out.println(res);
    }

    private static Double calculate(String numbers) {
        // opt 保存操作符,number保存 数字
        Stack<Character> opt = new Stack<>();
        Stack<Double> number = new Stack<>();
        char[] chars = numbers.toCharArray();
        // init stacks
        for (int i = 0; i < numbers.length(); i++) {
            switch (chars[i]) {
                case '+':
                case '-':
                case '*':
                case '/':
                    opt.push(chars[i]);
                    break;
                case '(':
                    break;
                case ')':
                    Double temp;
                    Character operator = opt.pop();
                    Double num1 = number.pop();
                    Double num2 = number.pop();

                    // 运算结果压入 number stack
                    switch (operator) {

                        case '+':
                            temp = num1 + num2;
                            number.push(temp);
                            break;
                        case '-':
                            temp = num1 - num2;
                            number.push(temp);
                            break;
                        case '*':
                            temp = num1 * num2;
                            number.push(temp);
                            break;
                        case '/':
                            temp = num1 / num2;
                            number.push(temp);
                            break;
                    }
                    break;

                default:
                    // 默认是'0'-'9'
                    Double num = Double.parseDouble(String.valueOf(chars[i]));
                    number.push(num);
            }
        }

        // 此时 number stack 只有最终的运算结果。
        return number.pop();
    }


}

上一篇 下一篇

猜你喜欢

热点阅读