从列表中计算答案

时间:2013-12-27 11:10:46

标签: java list calculator rpn

我必须在java中创建一个能够使用括号,加号,减号,除法和乘法的计算器,到目前为止,如果用户输入的话,我已经得到了它:

14 *(2 - (3/2))

然后它返回一个ArrayList:

[14.0, 2.0, 3.0, 2.0, /, -, *]

这就是我想要的

然后如何将'/'应用于2和3以获得:

[14.0, 2.0, 1.5, -, *]

然后如此,所以' - '到2和1.5得到:

[14.0, 0.5, *] 

这个随身携带的最终答案是7.0

有人可以建议如何做到吗?

为任何帮助干杯:)

3 个答案:

答案 0 :(得分:1)

你应该只将数字推入堆栈。因此运营商不会进入堆栈。这意味着列表如下:

[14.0, 2.0, 3.0, 2.0]
// applying / by popping two elements and adding the result
[14.0, 2.0, 1.5]
// applying - by popping two elements and adding the result
[14.0, 0.5]
// applying * by popping two elements and adding the result
[7.0]

请注意,这意味着您需要确定数字何时进入堆栈以及何时应用运算符。

答案 1 :(得分:0)

您可以使用以下内容:

List<String> list=new ArrayList<String>();
     list.add("5");
     list.add("6");
     list.add("7");
     list.add("-");
     list.add("+");
     String prev=null;
     String cur=null;

     List newList=new ArrayList(list);
     Iterator<String> iterator=newList.iterator();
     String val;
     int index=0;

     while(iterator.hasNext()){
          val=iterator.next();
         if(val.matches("(-)?\\d+([.]\\d+)?")){
             prev=cur;
             cur=val;                            
         }
         else{
                index=list.indexOf(prev);
                list.remove(prev);
                list.remove(cur);
                list.remove(val);

            if(val.equals("+")){
                list.add(index,(Float.parseFloat(prev)+Float.parseFloat(cur))+"");
            }
            else if(val.equals("-")){
                list.add(index,(Float.parseFloat(prev)-Float.parseFloat(cur))+"");
            }
           //Initialize iterator to point first element
            newList=new ArrayList(list);
            iterator=newList.iterator();
            prev=null;
            cur=null;
         }
     }



    iterator=list.iterator();
     while(iterator.hasNext()){
         String val1=iterator.next();
         System.out.println(" ## "+val1 );
     }

条件:     - 此代码适用于二元运算符,不适用于一元运算符。

答案 2 :(得分:0)

我认为您应该使用ArrayList<Object>而不是ArrayList<String>并使用递归来计算括号中表达式的值。该算法简要如下:如果列表ArrayList<Object>的元素是String类的一个实例,那么我们就像你到目前为止那样处理它(它是单个数字或运算符)。如果列表ArrayList<Object>的元素是List类的实例,则使用递归来计算表达式的值,该值位于该列表中。
例如,如果你有一个表达式:

14 * ( 2 - ( 3 / 2 ) )

它应该返回一个ArrayList:

[14.0, [2.0, [3.0, 2.0, /], -], *]

我希望我的回答对你有所帮助。