• 算数表达式——Dijkstra双栈算数表达式求值算法


    举例


    ( 1 + (( 2 + 3 ) * ( 4 * 5 ))) = 101


    递归定义


    • 算术表达式可能是一个数,或者是由一个左括号、一个算术表达式、一个运算符、另一个算术表达式和一个右括号组成的表达式

    E.W.Dijkstra算法思想


    (表达式由括号、运算符和操作数(数字)组成)

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

    Java


    • 源码
    public class Evaluate {
        
        // 双栈算数表达式求值
        public static double evaluate(String[] expr) {
            Stack<String> ops = new Stack<String>();
            Stack<Double> vals = new Stack<Double>();
            for (String s : expr) {
                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 v = vals.pop();
                    if (op.equals("+")) v = vals.pop() + v;
                    else if (op.equals("-")) v = vals.pop() - v;
                    else if (op.equals("*")) v = vals.pop() * v;
                    else if (op.equals("/")) v = vals.pop() / v;
                    else if (op.equals("sqrt")) v = Math.sqrt(v);
                    vals.push(v);
                } else vals.push(Double.parseDouble(s));
            }
            return vals.pop();
        }
    }
    
    • 测试用例
    public class Test {
        public static void main(String[] args) {
    
            String[] ss = {"(", "1", "+", "(", "(", "2", "+", "3", ")", "*", "(", "4", "*", "5", ")", ")", ")"};
            System.out.println(Evaluate.evaluate(ss));
        }
    }
    
    • 测试结果
    101.0
    
  • 相关阅读:
    Sphinx安装流程及配合PHP使用经验
    使用HTML5视频事件示例
    Centos6.5下编译安装mysql 5.6
    AES加密
    ab参数详解 – 压力测试
    vim 常用快捷键
    telnet操作memcache
    如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作
    array_map 巧替 foreach
    mac brew安装mysql
  • 原文地址:https://www.cnblogs.com/freelancy/p/8024348.html
Copyright © 2020-2023  润新知