2017-01-24 77 views
-3

私はスタックデータ構造を使用して数学的表現の問題を解決しています。文字列から数値と数学記号を抽出することに固執します。私がしたいのは、与えられた式を評価するプログラムを作ることです。文字列からの整数と文字の抽出

私の質問は、文字列からすべての数字と記号を新しい文字列配列に抽出する方法です。

Input: 12*1*145*2+8*1*1+2*3+2+4 

新しい文字列配列は次のようになります。

String[] expArray={"12","*","1","*","145","*","2","+","8","*","1","*","1","+","2","*","3","+","2","+","4"} 

私はnextInt()split()next()nextByte()と試みたが、それは失敗しました。他のことは心配しないでください。私はちょうど私が話していることを明確にするために問題を述べた。

更新:array[i]*10+array[i+1]などのような整数を構築するソリューションは必要ありません。私が必要とするのはより最適な解決策です。

+0

代わりにMichaelLihsの編集@残してください、それは完全に良いです。 – halfer

+0

2つの積極的なロールバックのためにモデレーターにフラグを立てます。 – halfer

答えて

2

しかし、他の人が興味を持っている可能性があるので、とにかく投稿しました。

import java.util.*; 

public class Test { 
    public static void main(String... args) { 
     String s = "12*1*145*2+8*1*1+2*3+2+4"; 
     List<String> tokens = new ArrayList<>(); 
     // for building numbers 
     StringBuilder builder = new StringBuilder(); 
     // assume there are only 2 types (number and operators) 
     boolean isNumber = false; 
     for (char c : s.toCharArray()) { 
      if (Character.isDigit(c)) { 
       if (!isNumber) { 
        builder = new StringBuilder(); 
        isNumber = true; 
       } 
       builder.append(c); 
      } else { 
       if (isNumber) { 
        tokens.add(builder.toString()); 
        isNumber = false; 
       } 
       // assume operators are exactly 1 char 
       tokens.add(String.valueOf(c)); 
      } 
     } 
     if (isNumber) 
      tokens.add(builder.toString()); 
     System.out.println(tokens); 
    } 
} 

出力:

[12, *, 1, *, 145, *, 2, +, 8, *, 1, *, 1, +, 2, *, 3, +, 2, +, 4] 

より一般的なアプローチではなくbooleanの現在の状態を維持するタイプのenumを使用し、そのトークンがないように、すべてのタイプのbuilderを使用します1文字に制限されています。

次に、あなたはおそらくAST ...

+0

ありがとうございます。それは私をたくさん助けました。 –

1

に他人のために正規表現を使用してソリューションを構築する必要があります:

String inputStr = "12*1*145*2+8*1*1+2*3+2+4"; 
String inputPattern = "(\\d+|[+-/*]{1})"; 

List<String> strList=new ArrayList<>(); 

Pattern patternObj = Pattern.compile(inputPattern); 
Matcher matcherObj = patternObj.matcher(inputStr); 


while (matcherObj.find()) {   
    strList.add(matcherObj.group(0)); 
} 

System.out.println(strList); 
関連する問題