1

重複の可能性:
文字列形式で与えられた数式の評価

私たちの任務で助けが必要です。演算子の優先順位を使用して計算するプログラムを作成しようとしています。可能であれば、配列リスト内の式を計算したいと考えています。例のために。[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);
                    }
4

1 に答える 1

4

単純に文字列の Collection を使用するよりも、より複雑な式の構造を構築することを検討する必要があります。

基本的に、与えられた算術式を、与えられた文脈自由文法に基づいて抽象構文木に解析したいと思うでしょう。これは大まかに次のようになります:

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

この文法は、必要なものの大まかなアイデアにすぎませんが、必要なものを簡単に実装するのに役立つことは間違いありません。

ここに別の質問がありますが、これは明らかに関連しています。特にこの答えはあなたにとって本当に興味深いものです。

于 2012-10-12T12:11:25.997 に答える