双栈算术表达式求值算法

算法描述

表达式由括号、运算符和操作数组成,从左向右逐个进行如下处理:

  • 将操作数压入操作数栈
  • 将运算符压入运算符栈
  • 忽略左括号
  • 遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈

最后在操作数栈中的值就是这个表达式的运算结果

双栈算术表达式求值算法_第1张图片

代码实现

package ch1;

import java.util.Scanner;

/**
 * Dijkstra的双栈算术表达式求值算法
 * 将操作数压入操作数栈
 * 将运算符压入运算符栈
 * 忽略左括号
 * 遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈
 */
public class Evaluate {
    public static void main(String[] args) {
        ResizingArrayStack<String> ops = new ResizingArrayStack<>(); // 运算符栈
        ResizingArrayStack<Double> numbers = new ResizingArrayStack<>(); // 操作数栈
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String s = scanner.next();
            if (s.equals("(")) {
                // 忽略左括号
            } else if (s.equals("+")) {
                ops.push(s);
            } else if (s.equals("-")) {
                ops.push(s);
            } else if (s.equals("*")) {
                ops.push(s);
            } else if (s.equals("/")) {
                ops.push(s);
            } else if (s.equals("sqrt")) {
                ops.push(s);
            } else if (s.equals(")")) {
                // 遇到右括号,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈
                String op = ops.pop();
                double val = numbers.pop();
                if (op.equals("+")) {
                    val = numbers.pop() + val;
                } else if (op.equals("-")) {
                    val = numbers.pop() - val;
                } else if (op.equals("*")) {
                    val = numbers.pop() * val;
                } else if (op.equals("/")) {
                    val = numbers.pop() / val;
                } else if (op.equals("sqrt")) {
                    val = Math.sqrt(val);
                }
                numbers.push(val);
            } else {
                // 数字压入操作数栈
                numbers.push(Double.parseDouble(s));
            }
        }
        // 输出最后的结果
        System.out.println(numbers.pop());
    }
}

测试结果

( ( 1 + sqrt ( 5.0 ) ) / 2.0 )
^D
1.618033988749895

Process finished with exit code 0

你可能感兴趣的:(Algorithm)