用堆栈实现中缀表达式的计算

proheart
public class CalculateDemo {
    /*
    使用栈计算中缀表达式的结果。表达式只含有数字(0-9)和加减乘除符号
    3+2*6-2 = 11
    步骤:
    1.遍历表达式
    2.如果是数字,直接入数栈
    3.如果是符号:
        3.1.若当前符号栈为空,则直接入栈
        3.2.若当前符号栈有操作符,就比较
            a.若当前操作符 优先级<=栈顶操作符,则pop处两个数,pop1个操作符,进行运算,结果入数栈,当前操作符入符号栈
            b.若当前操作符 优先级>栈顶操作符,则当前操作符入符号栈
    4.表达式扫描完毕,就顺序从符号栈和数字栈pop,并运算,结果push进数栈
    5.最后在数栈中只有一个数字,就是表达式的结果
     */

    public double calculate(String exp) {
        Stack<Character> opStack = new Stack();
        Stack<Double> numStack = new Stack();
        for (int i = 0; i < exp.length(); i++) {
            char c = exp.charAt(i);
            if (isOp(c)) { // 操作符
                if (opStack.isEmpty()) opStack.push(c);
                else {
                    // 若当前操作符c优先级<=栈顶操作符
                    if (priority(c) <= priority(opStack.peek())) {
                        double n1 = numStack.pop();
                        double n2 = numStack.pop();
                        char op = opStack.pop();
                        double res = calculate(n2, n1, op);
                        // pop两个数字和一个操作符(注意顺序) 计算结果入栈 并把当前操作符入栈
                        numStack.push(res);
                        opStack.push(c);
                    } else {
                        // 否则直接把当前操作符入栈
                        opStack.push(c);
                    }
                }
            } else { // 是数字
                int cur = c - '0';
                numStack.push((double)cur);
            }
        }
        // 现在栈中存放的都是优先级一样的操作符,按pop顺序进行计算,结果入栈
        while (!opStack.isEmpty()) {
            char op = opStack.pop();
            double n1 = numStack.pop();
            double n2 = numStack.pop();
            double res = calculate(n2, n1, op);
            numStack.push(res);
        }
        // 最终数字栈剩余一个数字,就是表达式的最终结果
        return numStack.pop();
    }

    public double calculate(double a, double b, char c) {
        if (c == '+') return a + b;
        if (c == '-') return a - b;
        if (c == '*') return a * b;
        if (c == '/') return a / b;
        throw  new RuntimeException("invalid input");
    }
    public boolean isOp(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; }
    public int priority(char c) {
        if (c == '+' || c == '-') return 1;
        if (c == '*' || c == '/') return 2;
        return -1;
    }
    public static void main(String[] args) {
        String exp = "3+2*6-2";
        String exp1 = "7*2*2-5+1-5+3-4";
        CalculateDemo app = new CalculateDemo();
        System.out.println(app.calculate(exp));
        System.out.println(app.calculate(exp1));
    }
}
阅读 1.8k

来刷算法
Learn data structure and algorithm using java.

Developer, Java & Android

38 声望
20 粉丝
0 条评论

Developer, Java & Android

38 声望
20 粉丝
文章目录
宣传栏