package com.Dijkstra;
import com.Stack.ArrayToStack;
/**
* 利用2个栈实现简单的运算操作
* Dijkstra双栈算法
*
* 1、将操作数压入操作数栈;
* 2、将运算符压入运算符栈;
* 3、忽略左括号;
* 4、在遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈
*/
public class Evaluate {
public static void main(String[] args) {
String s = "(1+((2+3)*(4*5)))";
test(s);
}
public static void test(String str){
ArrayToStack<String> ops = new ArrayToStack<String>(10);//运算符栈
ArrayToStack<Double> vals = new ArrayToStack<Double>(10);//操作数栈
for(int i =0; i<str.length();i++){
String s = (char)str.getBytes()[i] +""; //挨个取出字符
//读取字符。如果是运算符则压入栈
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)); //不是运算符号,则是操作数,将操作数压入操作数栈中
}
}
System.out.println(vals.pop());//打印出最终结果
}
}
栈可以用我的上一篇文章,利用数组实现一个简单的栈,也可以利用jdk自带的栈