zoukankan      html  css  js  c++  java
  • [algorithm] Dijkstra双栈算法表达式求值算法

    一、原理

    Dijkstra所做的一个算法,双栈求值,用两个栈(一个保存运算符,一个用于保存操作数),

    表达式由括号,运算符和操作数组成。

    (1).将操作数压入操作数栈

    (2).将运算符压入运算符栈;

    (3).忽略左括号;

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

    二、算法轨迹图

    左括号忽略,右括号开始出栈计算

    三、代码

    import java.util.Scanner;
    import java.util.Stack;
    
    /**
     * Dijkstra双栈算术表达式求值算法
     * @author xwolf
     * @date 2017-05-24 18:45
     * @since 1.8
     */
    public class Dijkstra {
        private static Stack<String> ops = new Stack<>();
        private static Stack<Integer> vals = new Stack<>();
        public static int calculator(){
            Scanner scanner = new Scanner(System.in);
            while (scanner.hasNext()){
                String exp = scanner.next();
                System.out.println(exp);
                if ("exit".equals(exp)){
                    System.exit(1);
                }
                if ("over".equals(exp) && !vals.isEmpty()){
                    return vals.pop();
                }
                switch (exp){
                    case "(":
                        break;
                    case "+":
                        ops.push(exp);
                        break;
                    case "-":
                        ops.push(exp);
                        break;
                    case "*":
                        ops.push(exp);
                        break;
                    case "/":
                        ops.push(exp);
                        break;
                    case "%":
                        ops.push(exp);
                        break;
                    case ")":
                        while(!ops.isEmpty() && !vals.isEmpty()){
                            String op = ops.pop();
                            int result = get(op,vals.pop(),vals.pop());
                            vals.push(result);
                        }
                        break;
                     default:
                            vals.push(Integer.parseInt(exp));
                            break;
                }
            }
            return 0;
        }
    
        private static int get(String op,int val,int bval){
            int result = 0 ;
            switch (op){
                case "+":
                     result = bval+val;
                    break;
                case "-":
                     result = bval-val;
                    break;
                case "*":
                    result = val*bval;
                    break;
                case "/":
                    result = bval/val;
                    break;
                case "%":
                    result = bval % val;
                    break;
            }
            return result;
        }
    }
    

      

     参考:

    《算法 第4版》

  • 相关阅读:
    Python之旅的第19天(类的初识)
    Python之旅的第18天(configparser、hashlib模块)
    Python之旅的第17天(re模块、logging模块)
    第二阶段个人冲刺博客1
    注释
    第十五周学习进度博客
    第十四周学习进度博客
    12-用户体验评价
    11-找水王
    第十三周学习进度博客
  • 原文地址:https://www.cnblogs.com/lonelywolfmoutain/p/6903236.html
Copyright © 2011-2022 走看看