您的位置:首页 > 其它

Dijkstra的双栈算术表达式求值算法

2016-07-05 20:04 323 查看
注:不考虑乘除优先级,使用括号确定计算顺序

public static double evaluate(String inStr) {
Stack<String> ops = new Stack<String>(); //操作符栈
Stack<Double> vals = new Stack<Double>(); //操作数栈
char[] arr = inStr.toCharArray();
for(char c : arr){
String s =c+"";
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("/")) 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;
vals.push(v);
}
else vals.push(Double.parseDouble(s));
}
return vals.pop();
}


测试:

String s = "(1+(3*4)+3)";

System.out.println(evaluate(s));

15
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: