该方法不能省略括号,乘除法也需要添加括号
/**
* Dijkstra双栈算术表达式求值算法
*/
public class Compute {
public static void main(String[] args) {
MyStack<Double> vals=new MyStack<Double>();
MyStack<String> ops=new MyStack<String>();
String str=new String("(1+((2+3)*(4*5)))");
String s = null;
for (int i=0;i<str.length();i++){
s = String.valueOf(str.charAt(i));
switch (s){
case "(":break; //遇左括号直接舍弃
case "+":
case "-":
case "*":
case "/":
ops.push(s); //运算符压栈
break;
case ")":
double a=vals.pop(); //操作数弹栈
String op=ops.pop(); //运算符弹栈
double result=0.0;
switch (op){
case "+":
result=a+vals.pop();
break;
case "-":
result=a-vals.pop();
break;
case "*":
result=a*vals.pop();
break;
case "/":
result=a/vals.pop();
break;
}
vals.push(result); //结果压栈
break;
default:vals.push(Double.parseDouble(s)); //操作数压栈
}
}
System.out.println(vals.pop()); //结果输出
}
}