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