[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版》

posted @ 2017-05-25 13:21  snow__wolf  阅读(849)  评论(0编辑  收藏  举报