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
  • 相关阅读:
    UML 类之间的关系
    [noi.ac省选模拟赛]第11场题解集合
    [CF1270F]Awesome Substrings
    [noi.ac省选模拟赛20200606]赌怪
    FFT,NTT入门
    [AHOI2017/HNOI2017]单旋
    [HNOI2016]最小公倍数
    [HNOI2016]树
    [HNOI2016]大数
    服务外包概论课程资料
  • 原文地址:https://www.cnblogs.com/tanxing/p/5591930.html
Copyright © 2011-2022 走看看