1

Java で RPN 計算機を実装していますが、方程式を個別のトークンに解析するためのクラスを作成するのに助けが必要です。

私の入力ファイルには、以下に示すような未知の数の方程式が含まれます。

49+62*61-36
4/64
(53+26)
0*72
21-85+75-85
90*76-50+67
46*89-15
34/83-38
20/76/14+92-15

プログラムで使用する独自のジェネリック スタック クラスを既に実装していますが、現在、入力ファイルからデータを読み取る方法を見つけようとしています。どんな助けでも感謝します。

スタック クラスのソース コードをPasteBinに投稿しました。

また、ファイルを読み取らずに計算機を PasteBin にアップロードして、既に行ったことを示しています。

ファイルを読み込んでトークンを分割することができました。助けてくれてありがとう。ファイルの最後に到達するとエラーが発生し、それを解決する方法を知りたいですか?

コードは次のとおりです。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;

 public class TestClass {    
  static public void main(String[] args) throws IOException {
 File file = new File("testEquations.txt");
  String[] lines = new String[10];
  try {
    FileReader reader = new FileReader(file);
    BufferedReader buffReader = new BufferedReader(reader);
    int x = 0;
    String s;
    while((s = buffReader.readLine()) != null){
        lines[x] = s;
        x++;
    }
 }
  catch(IOException e){
    System.exit(0);
}
String OPERATORS = "+-*/()";

for (String st : lines) {
    StringTokenizer tokens = new StringTokenizer(st, OPERATORS, true);
    while (tokens.hasMoreTokens()) {
        String token = tokens.nextToken();
        if (OPERATORS.contains(token))
            handleOperator(token);
        else
            handleNumber(token);
    }
     }
   }

private static void handleNumber(String token) {
System.out.println(""+token);

   }

 private static void handleOperator(String token) {
System.out.println(""+token);

  }
  }

また、RPN が行ごとに機能することを確認するにはどうすればよいですか? 従おうとしているアルゴリズムにかなり混乱しています。

4

3 に答える 3

4

すべての演算子は 1 文字であるためStringTokenizer、数値トークンと共にそれらを返すように指示できます。

String OPERATORS = "+-*/()";
String[] lines = ...

for (String line : lines) {
    StringTokenizer tokens = new StringTokenizer(line, OPERATORS, true);
    while (tokens.hasMoreTOkens()) {
        String token = tokens.nextToken();
        if (OPERATORS.contains(token))
            handleOperator(token);
        else
            handleNumber(token);
    }
}
于 2012-11-17T16:25:59.127 に答える
1

あなたの質問は元のバージョンから完全に変更されたため、これは元の質問への対応であり、FileReader を使用してファイルから値を取得する方法でした。

これにより、各行が String 配列の個別の要素に配置されます。はるかに柔軟なので、代わりに ArrayList を使用する必要がありますが、簡単なデモとしてこれを行ったところです。必要に応じてクリーンアップできますが、使用しているコードは入力として文字列配列を想定していることに気付きました。おそらく、最初に値を ArrayList に読み込み、すべての行を取得したらそれを配列にコピーすることができます。これにより、必要な数の行を入れて、コードの行数の変更に対して柔軟に保つことができます。入力ファイル。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class TestClass {    
  static public void main(String[] args) {
    File file = new File("myfile.txt");
    String[] lines = new String[10];
    try {
        FileReader reader = new FileReader(file);
        BufferedReader buffReader = new BufferedReader(reader);
        int x = 0;
        String s;
        while((s = buffReader.readLine()) != null){
            lines[x] = s;
            x++;
        }
    }
    catch(IOException e){
        //handle exception
    }
    // And just to prove we have the lines right where we want them..
    for(String st: lines)
    System.out.println(st);
  }
}

このリンクのコードを使用していると前に述べました。

http://www.technical-recipes.com/2011/a-mathematical-expression-parser-in-Java/#more-1658

これはすでに演算子の優先順位を扱っているようですよね? そして、配列から各文字列を解析し、それらを数値または演算子にソートしますか? ざっと見てみると、少なくともそうしているように見えます。

したがって、必要なのは行を String 配列にすることだけのように見えます。これを、既に持っているコードに渡します。とにかく私が見ることができるものから。

明らかに、これは 9 より大きい数の問題には対応していませんが、うまくいけば、前半で役立つでしょう。

:-)

于 2012-11-17T17:30:18.007 に答える