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符号是您已经拥有的。有什么需要混淆的?