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

注:不考虑乘除优先级,使用括号确定计算顺序

 

     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

欢迎关注公众号:

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

 

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/moshenglv/article/details/51834236
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞