zoukankan      html  css  js  c++  java
  • Dijkstra的双栈算术表达式的求值算法

    例如需要计算 ( 1 + (  ( 2 + 3 ) * ( 4 * 5 ) ) )

    我们以字符串的形式输入该表达式,利用两个栈来完成这个操作,其中一个栈保存运算符,一个栈保存操作数,过程是这样的:

    表达式由括号,运算符号,操作数(数字)组成,从左到右处理这四种情况.

    将操作数压入操作数栈.

    将运算符压入运算符栈.

    忽略左括号

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

    在处理完最后一个括号时,操作数栈上只剩下了一个值,它就是表达式的值.每当算法遇到一个被括号包围并由一个运算符和两个操作数组成的子表达式时,它都将运算符和操作数计算的结果压入操作数栈中,这样的结果就好像在输入中用这个值代替了该子表达式,因此用这个子表达式得到的结果和原表达式相同,我们反复应用这个规律并的到一个最终值.

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

    ( 1 + ( 5 * ( 4 * 5 ) ) )

    ( 1 + ( 5 * 20 ) )

    ( 1 + 100 )

    101

    下面是java的例子

    public class Evaluate {
    
        public static void main(String[] args) {
            Stack<String> ops = new Stack<String>();    //运算符栈
            Stack<Double> vals = new Stack<Double>();    //操作数栈
            //IO流读取数据
            while(!StdIn.isEmpty()){
                String s = StdIn.readString();
                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));
                }
            }
            
            StdOut.print(vals.pop());
            
        }
    
    }
    View Code
  • 相关阅读:
    tf导出pb文件,以及如何使用pb文件
    word2vec入门理解的博客整理
    简单的RNN和BP多层网络之间的区别
    图像中用到的信息论中的一些概念公式
    raw文件转mha文件
    mha格式的CT体数据转为jpg切片
    在MySQL的表中增加一列
    ES7学习笔记(二)ES的集群原理
    MySQL中的幻读,你真的理解吗?
    ES7学习笔记(一)Elasticsearch的安装与启动
  • 原文地址:https://www.cnblogs.com/tanxing/p/5591930.html
Copyright © 2011-2022 走看看