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

时间:2012-10-12 12:06:19

标签: java list

  

可能重复:
  Evaluating a math expression given in string form

我需要一些帮助。我试图创建一个将使用运算符优先级计算的程序。如果有可能,我想计算一个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);
                    }

1 个答案:

答案 0 :(得分:4)

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

基本上,您需要根据给定的abstract syntax tree将给定的算术表达式解析为context free grammar,这可能大致如下所示:

ArithmethicExpression := CompoundExpression | LiteralExpresion
LiteralExpression := {0-9}+ (meaning at least one digit)
CompoundExpression := LiteralExpression FunctionExpression LiteralExpression

这个语法只是对你需要什么的粗略概念,但它肯定会帮助你更容易地实现你所需要的。

还有另一个问题here,这显然是相关的。特别是this回答对你来说真的很有意思。