• 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
  • 相关阅读:
    ReenTrantLock可重入锁(和synchronized的区别)总结
    什么是死锁?如何解决死锁?【转载】
    android studio 完整安装教程,已完全实践过
    foxmail创建163公司企业邮箱的时候会出现ERR Unable to log on
    Android 开发 res里面的drawable(ldpi、mdpi、hdpi、xhdpi、xxhdpi)
    android studio 突然出现Gradle project sync failed 错误
    android 开发edittext获取焦点时hint消失
    Z480联想笔记本突然没有了声音
    android聊天,存储聊天记录sqlite
    adb shell出现error错误
  • 原文地址:https://www.cnblogs.com/tanxing/p/5591930.html
Copyright © 2020-2023  润新知