java中使用列表的运算符优先级

java中使用列表的运算符优先级,java,list,Java,List,可能重复: 我的作业需要一些帮助。我正在尝试创建一个程序,该程序将使用运算符优先级进行计算。如果可能的话,我想在arraylist中计算表达式。例如,[4+2x2-3]应首先计算2x2,因此结果将为[4+4-3],依此类推。。。我的程序只计算第一次操作,但无法通过其他操作重复。也。。它仅在最高优先级运算符处于开始位置时计算。例[2^1-2]变为[2-2]。但是当[2-1^2]没有任何作用时。谢谢你的帮助 List<String> subroutine = new CopyOnWri

可能重复:

我的作业需要一些帮助。我正在尝试创建一个程序,该程序将使用运算符优先级进行计算。如果可能的话,我想在arraylist中计算表达式。例如,[4+2x2-3]应首先计算2x2,因此结果将为[4+4-3],依此类推。。。我的程序只计算第一次操作,但无法通过其他操作重复。也。。它仅在最高优先级运算符处于开始位置时计算。例[2^1-2]变为[2-2]。但是当[2-1^2]没有任何作用时。谢谢你的帮助

List<String> subroutine = new CopyOnWriteArrayList<String>(input);
        for(String i : subroutine)
    {
        switch(currentstate)
        {
            case q0:
                if(isDigit(i))
                {
                    currentstate = q1;
                }
            break;

            case q1:
                if(i.equals("^"))
                {
                    maxPriority = i;
                    int index = subroutine.indexOf(maxPriority);
                    int num1 = Integer.parseInt(subroutine.get(index-1));
                    int num2 = Integer.parseInt(subroutine.get(index+1));
                    int total = (int) Math.pow(num1, num2);

                    String stringTotal = Integer.toString(total);
                    String addToExp = subroutine.set(index, stringTotal);
                    int indexAddToExp = subroutine.indexOf(stringTotal);
                    subroutine.remove(indexAddToExp+1);
                    subroutine.remove(indexAddToExp-1);
                    System.out.println(subroutine);
                }
                else if( (i.equals("x") || i.equals("/")) && (!input.contains("^")) )
                {
                    if(i.equals("x"))
                    {
                        maxPriority = i;
                        int index = subroutine.indexOf(maxPriority);
                        int num1 = Integer.parseInt(subroutine.get(index-1));
                        int num2 = Integer.parseInt(subroutine.get(index+1));
                        int total = num1 * num2;

                        String stringTotal = Integer.toString(total);
                        String addToExp = subroutine.set(index, stringTotal);
                        int indexAddToExp = subroutine.indexOf(stringTotal);
                        subroutine.remove(indexAddToExp+1);
                        subroutine.remove(indexAddToExp-1);
                    }
List子例程=新建CopyOnWriteArrayList(输入);
for(字符串i:子例程)
{
开关(当前状态)
{
案例q0:
if(isDigit(i))
{
currentstate=q1;
}
打破
案例q1:
如果(i.等于(“^”))
{
maxPriority=i;
int index=subroutine.indexOf(maxPriority);
int num1=Integer.parseInt(子例程.get(索引-1));
intnum2=Integer.parseInt(子程序.get(索引+1));
整数总计=(整数)数学功率(num1,num2);
字符串stringTotal=Integer.toString(total);
String addToExp=subroutine.set(索引,stringTotal);
int indexAddToExp=子例程.indexOf(stringTotal);
子程序.remove(indexAddToExp+1);
子程序.remove(indexAddToExp-1);
System.out.println(子程序);
}
else如果((i.equals(“x”)|i.equals(“/”)和(!input.contains(“^”))
{
如果(i等于(“x”))
{
maxPriority=i;
int index=subroutine.indexOf(maxPriority);
int num1=Integer.parseInt(子例程.get(索引-1));
intnum2=Integer.parseInt(子程序.get(索引+1));
整数总计=num1*num2;
字符串stringTotal=Integer.toString(total);
String addToExp=subroutine.set(索引,stringTotal);
int indexAddToExp=子例程.indexOf(stringTotal);
子程序.remove(indexAddToExp+1);
子程序.remove(indexAddToExp-1);
}

> 你应该考虑建立一个更复杂的表达式结构,而不是简单的使用一个字符串集合。

基本上,您需要将给定的算术表达式解析为基于给定的,大致如下所示:

ArithmethicExpression := CompoundExpression | LiteralExpresion
LiteralExpression := {0-9}+ (meaning at least one digit)
CompoundExpression := LiteralExpression FunctionExpression LiteralExpression
这个语法只是你所需要的一个粗略的概念,但肯定会帮助你更容易地实现你所需要的


还有一个问题,它是明确相关的。尤其是答案对你来说很有意思。

你应该考虑建立一个更复杂的表达式结构,而不是简单地使用一个字符串集合。

基本上,您需要将给定的算术表达式解析为基于给定的,大致如下所示:

ArithmethicExpression := CompoundExpression | LiteralExpresion
LiteralExpression := {0-9}+ (meaning at least one digit)
CompoundExpression := LiteralExpression FunctionExpression LiteralExpression
这个语法只是你所需要的一个粗略的概念,但肯定会帮助你更容易地实现你所需要的


还有一个问题,这显然是相关的。特别是答案对你来说非常有趣。

对不起,我真的不太明白。lolA常规语法不行。他需要一个上下文无关的语法来处理优先级。@EJP我认为你是对的。至少暗示一些正式语法是有帮助的。我会编辑答案。im sorr是的,但我真的不明白。萝拉常规语法不行。他需要一个上下文无关的语法来处理优先级。@EJP我认为你是对的。至少暗示一些形式语法是有帮助的。我会编辑答案。没有堆栈你不能这样做。谷歌搜索“分流码算法”作为一种方法。我已经为我们制作了一个程序调车场算法后缀。但是我对这个中缀符号感到困惑。中缀符号是你已经有的。有什么要困惑的?没有堆栈你不能这么做。谷歌搜索“调车场算法”作为一种方法。我已经用调车场算法后缀做了一个程序。但是我对这个中缀符号感到困惑。我nfix符号是您已经拥有的。有什么需要混淆的?