Java 从列表中计算答案

Java 从列表中计算答案,java,list,calculator,rpn,Java,List,Calculator,Rpn,我必须用java制作一个计算器,能够使用括号,加、减、除、乘,到目前为止,如果用户输入: 14*(2-(3/2)) 然后返回一个ArrayList,如下所示: [14.0, 2.0, 3.0, 2.0, /, -, *] [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

我必须用java制作一个计算器,能够使用括号,加、减、除、乘,到目前为止,如果用户输入:

14*(2-(3/2))

然后返回一个ArrayList,如下所示:

[14.0, 2.0, 3.0, 2.0, /, -, *]
[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

有谁能建议怎么做


为任何帮助干杯:)

您应该只将数字推到堆栈上。所以操作符不在堆栈上。这意味着列表如下:

[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]

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

您可以使用以下内容:

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 );
     }
List List=new ArrayList();
列表。添加(“5”);
列表。添加(“6”);
列表。添加(“7”);
列表。添加(“-”);
列表。添加(“+”);
字符串prev=null;
字符串cur=null;
List newList=新阵列列表(List);
迭代器迭代器=newList.Iterator();
字符串val;
int指数=0;
while(iterator.hasNext()){
val=iterator.next();
如果(val.matches((-)\\d+([.]\\d+)){
prev=cur;
cur=val;
}
否则{
index=list.indexOf(prev);
列表。删除(上一个);
列表。删除(cur);
列表。删除(val);
如果(val.equals(“+”)){
添加(索引,(Float.parseFloat(prev)+Float.parseFloat(cur))+“”);
}
else if(val.equals(“-”)){
add(index,(Float.parseFloat(prev)-Float.parseFloat(cur))+“”);
}
//初始化迭代器以指向第一个元素
newList=新数组列表(list);
迭代器=newList.iterator();
prev=null;
cur=null;
}
}
迭代器=list.iterator();
while(iterator.hasNext()){
String val1=迭代器.next();
System.out.println(“##”+val1);
}
条件:
-此代码适用于二进制运算符,而不适用于一元运算符。

我认为您应该使用
ArrayList
而不是
ArrayList
,并使用递归来计算值​​括号中的表达式。算法大致如下:如果list
ArrayList
的元素是
String
类的一个实例,那么我们将其视为您到目前为止所做的事情(它要么是一个数字,要么是一个运算符)。如果list
ArrayList
的元素是list类的实例,则使用递归计算该列表中表达式的值。
例如,如果您有一个表达式:

14 * ( 2 - ( 3 / 2 ) )
它应返回ArrayList,如下所示:

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

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

为什么您需要这种特殊的列表安排?您没有考虑操作顺序。您甚至可能需要两个不同的列表,一个是两个保持值,另一个是保持运算符。我会用两个堆栈你需要一个堆栈。写一个循环,在每次迭代中读取一个输入,可以是一个运算符的数字。如果是一个数字,则将其推送到堆栈上;如果是运算符,则从堆栈中弹出两个元素,执行该操作,然后再次将结果推送到堆栈上。我在这里用eval_expr方法编写了一个解决方案,但是,在PythonI中,我更新了我的答案。(检查下面的答案。),我想可以。