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

由于所有运算符都是单个字符,因此您可以指示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 从文件中获取值。

这会将每一行放入字符串数组的单独元素中。您可能应该使用 ArrayList 代替,因为它更加灵活,但我只是将其作为一个快速演示 - 您可以根据需要对其进行清理,尽管我注意到您使用的代码需要一个 String 数组作为输入。也许您可以最初将这些值读入一个 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

这似乎已经处理了运算符优先级不是吗?并解析数组中的每个字符串并将它们排序为数字或运算符?从我的快速浏览来看,至少它似乎可以做到这一点。

所以看起来你只需要将你的行放在一个字符串数组中,然后你将它传递给你已经拥有的代码。无论如何,从我所看到的。

显然,这并不能解决大于 9 的数字问题,但希望它对上半年有所帮助。

:-)

于 2012-11-17T17:30:18.007 回答
0
public void actionPerformed(ActionEvent e) {
    double sum=0;
    int count = 0 ;
    try {
        String nomFichier = "Fichier.txt";
        FileReader fr = new FileReader(nomFichier);
        BufferedReader br = new BufferedReader(fr);
        String ligneLue;

        do {
            ligneLue = br.readLine();
            if(ligneLue != null) {
                StringTokenizer st = new StringTokenizer(ligneLue, ";");
                String nom = st.nextToken();
                String prenom = st.nextToken();
                String age = st.nextToken();
                String tele = st.nextToken();
                String adress = st.nextToken();
                String codePostal = st.nextToken();
                String ville = st.nextToken();
                String paye = st.nextToken();
                double note = Double.parseDouble(st.nextToken());
                count++;
            }
        }
        while(ligneLue != null);
        br.close();
        double mediane = count / 2; 
        if(mediane % 2 == 0) {
            JOptionPane.showMessageDialog(null, "Le mediane dans le fichier est " + mediane);
        }
        else {
            mediane +=1;   
            JOptionPane.showMessageDialog(null, "Le mediane dans le fichier est " + mediane);
        }
    }//fin try
    catch(FileNotFoundException ex) {
        System.out.println(ex.getMessage());
    }
    catch(IOException ex) {
       System.out.println(ex.getMessage());
    }               
}
于 2020-02-16T00:50:54.923 回答