2

私は単純な数式計算機を作成しており、足し算と引き算で行き詰まっています。ご存知のように、方程式を計算するときは、優先順位の算術規則に従います。つまり、括弧、順序:累乗関数、除算、乗算、加算、および減算です。問題は、足し算と引き算が同じ優先順位で行われるため、左から右に読むことができることです。これまでの私のコードは次のとおりです。

{
ArrayList<String> equation = java.util.Arrays.asList({"2","-","2","+","5"});

  while(equation.contains("+")){
          addMe(equation);
  }
  while(equation.contains("-")){
          minusMe(equation);            
  }
}

public static void addMe(ArrayList<String> numberList){
 for (int i = 0, n = numberList.size(); i < n; i++) { 
   String value = (String) numberList.get(i); 
   if(value.equals("+")){

    String wordBefore = (String) numberList.get(i-1);
    String wordAfter = (String) numberList.get(i+1);
    System.out.println("This is the word before " + wordBefore);
    System.out.println("This is the word after " + wordAfter);
    double doubleFromBefore = Double.parseDouble(wordBefore);
    double doubleFromAfter = Double.parseDouble(wordAfter);
    double answer = doubleFromBefore + doubleFromAfter;
    System.out.println("This is the answer: " + answer);
    String stringAnswer = String.valueOf(answer);
    String newNum2 = value.replace(value, stringAnswer);
    numberList.set(i,newNum2);
    numberList.remove(i-1);
    numberList.remove(i);
    break;
  }
 }   
}

関連する場所に「-」があることを除いて、minusMe メソッドは addMe メソッドとまったく同じです。私が抱えている問題は、一度に1つのアイテムを左から右に読み取って、加算または減算のいずれかの方法を実行することです。理想的には、問題を解決するために 2 つの while ループをイテレータと組み合わせる必要があると思いますが、私の試みはうまくいきませんでした。これが私の問題を解決するかどうかについての考えはありますか? もしそうなら、修正されたループを提供してください。

よろしく

4

2 に答える 2

3

これを見てください

java.uti.ArrayList<String> equation = java.util.Arrays.asList({"2","-","2","+","5"});
java.util.Iterator<String> equIterator = equation.iterator();
int result = 0;
int multiplier = 1;
while(equIterator.hasNext()){
     String operandOrOperator = equIterator.next();
     if(operandOrOperator.equals("+")){
          multiplier=1;
     }else if(operandOrOperator.equals("-")){
          multiplier=-1;
     }else if(operandOrOperator.equals("*")){
          result*=Integer.parseInt(equIterator.next()); // Assuming that next element will be there always after operator.
     }else{
          result+=(multiplier * Integer.parseInt(operandOrOperator));
     }
}
System.out.println("Final result : " + result);
于 2013-01-25T07:56:19.693 に答える
0

あなたはこれをすべて間違っています。少なくとも再帰降下式パーサー、またはダイクストラの分路アルゴリズムを使用する必要があります。これが何らかの言語に成長する場合は、パーサー ジェネレーターを使用することもできます。これらはすべてウェブ検索で見つけることができます。

于 2013-01-26T23:39:51.827 に答える