我被分配任务困住了。问题要求将后缀表达式从输入文件转换为某些类似于中缀表达式的指定指令。结果必须打印在输出文件中。以下是输入:AB+C-ABC+-AB-C+DEF-+$ABCDE-+$*EF*-ABC+*CBA-+*ABC+/CBA*+AB-*CBA+-*ABC-/BA-+/ABC+$CBA-+*AB0+/CBA+-/ABC*+DE-/AB#CD@EF我可以使用System.out.println在控制台中打印结果,我可以将其用作质量检查:但是,一旦开始介绍PrintWriter并将System.out替换为pw,打印到输出文件的结果将变为以下内容:我希望输出文件中的结果看起来与控制台中的结果完全一样。任何帮助将不胜感激。代码如下:public class StackException extends Exception { public StackException(String message) { super(message); }}import java.util.*;import java.io.*;public class Stack { private final int stackSize = 100; private String[] stackArray; private int stackTop; Stack() { stackArray = new String[stackSize]; stackTop = -1; } public boolean isEmpty() { if (stackTop == -1) return true; else return false; } public void push(String input) throws StackException { if (stackTop == stackSize - 1) { throw new StackException("Stack Overflow. Exiting program now..."); } stackArray[++stackTop] = input; } public int size() { return stackTop + 1; } public String peek() throws StackException { if (isEmpty()) { throw new StackException("Stack Underflow. Exiting program now..."); } return stackArray[stackTop]; } public String pop() throws StackException { if (isEmpty()) { throw new StackException("Stack Underflow. Exiting program now..."); } return stackArray[stackTop--]; }}import java.io.*;import java.util.*;public class PostFixEval { public static void main(String[]args) throws StackException, IOException { File fin = new File(args[0]); boolean fileExist = fin.exists(); File fout = new File(args[1]); PrintWriter pw = new PrintWriter(new FileWriter(fout)); if(fileExist == true) { pw.println("\n" + "\t\t\t\t" + "--- EVALUATION BEGINS ---"); parseFromFile(args[0], args[1]); } else { translate(args[0], args[1]); } pw.println("\t\t\t\t" + "--- EVALUATION COMLETE ---" + "\n"); pw.close(); } public static void parseFromFile(String input, String output) throws IOException{ String line = null; int lineCounter = 0; PrintWriter pw = new PrintWriter(new FileWriter(output)); try { BufferedReader br = new BufferedReader(new FileReader(input)); try { while ((line = br.readLine()) != null) { lineCounter++; pw.println("EXAMPLE " + lineCounter + ": "); pw.println("Postfix Expression: " + line); try { translate(line, output); } catch (StackException e){ pw.println("ERROR: Invalid expression encountered: exiting"); pw.println(e); } pw.println("\n"); } br.close(); } catch (java.io.IOException e) { pw.println("EOF encountered"); } } catch (java.io.FileNotFoundException e) { pw.println("Cannot find file: " + input); return; } pw.close(); } private static boolean isOperator(String operator) { switch(operator) { case "+": case "-": case "*": case "/": case "$": return true; default: return false; } } private static String instruction(String oper) { switch(oper) { case "+": return "AD"; case "-": return "SB"; case "*": return "ML"; case "/": return "DV"; case "$": return "EX"; default: return "N/A"; } } public static void translate(String expression, String outputFile) throws StackException, IOException { Stack variables = new Stack(); int tempNum = 1; String arg1; String arg2; String op; String command; PrintWriter pw = new PrintWriter(new FileWriter(outputFile)); pw.println("Instructions in the Register:"); if (expression.trim().length() == 0) { throw new StackException("EMPTY STACK"); } for (int i=0; i<expression.length(); i++){ //if operator, pop arguments and evaluate if (isOperator(expression.substring(i, i+1))){ if (variables.isEmpty()) { throw new StackException("EMPTY STACK"); } command = instruction(expression.substring(i, i+1)); try { arg1 = variables.pop(); } catch (StackException e) { throw new StackException("EMPTY STACK ON ARG1"); } try { arg2 = variables.pop(); } catch (StackException e) { throw new StackException("EMPTY STACK ON ARG2"); } variables.push("TEMP" + tempNum); pw.println("LD " + arg2); pw.println(command + " " + arg1); pw.println("ST " + "TEMP" + tempNum); tempNum++; } else if (Character.isLetter(expression.charAt(i))) { //if variab.l+ng(i, i+1)); } else if (Character.isWhitespace(expression.charAt(i))) { //Ignore whitespace continue; } else { throw new StackException("Unrecognized characterr: " + expression.charAt(i) + " at position: " + i); } } if (variables.isEmpty() == false) { while (variables.isEmpty() == false) { if (variables.pop().startsWith("TEMP") == false){ throw new StackException("Leftover variables after evaluation."); } } } pw.close(); }} 最佳答案 您在类PrintWriter的方法main()中创建一个PostFixEval,因此,与其将输出文件的名称传递给方法parseFromFile()和translate(),不如将其传递给PrintWriter,并且不要创建更多新的这些方法中的对象。但是,这不是您的问题。从您发布的代码中,您的问题出在方法PrintWriter的这一行代码中else if (Character.isLetter(expression.charAt(i))) {如果条件为真,则您什么也不做。您需要将该字符压入堆栈。正如您所声称的,我没有看到用translate()替换System.out是怎么引起问题的。即使使用PrintWriter,您的代码仍然包含错误。这是我用上述修复和修改对您的代码进行的重写。请注意,我只更改了课程System.out,所以我仅发布了该课程。import java.io.*;public class PostFixEval { public static void main(String[] args) throws StackException, IOException { File fin = new File(args[0]); boolean fileExist = fin.exists(); File fout = new File(args[1]); try (PrintWriter pw = new PrintWriter(new FileWriter(fout))) { if (fileExist == true) { pw.println("\n" + "\t\t\t\t" + "--- EVALUATION BEGINS ---"); parseFromFile(args[0], pw); } else { translate(args[0], pw); } pw.println("\t\t\t\t" + "--- EVALUATION COMLETE ---" + "\n"); } } public static void parseFromFile(String input, PrintWriter pw) throws IOException { String line = null; int lineCounter = 0; try { BufferedReader br = new BufferedReader(new FileReader(input)); try { while ((line = br.readLine()) != null) { lineCounter++; pw.println("EXAMPLE " + lineCounter + ": "); pw.println("Postfix Expression: " + line); try { translate(line, pw); } catch (StackException e) { pw.println("ERROR: Invalid expression encountered: exiting"); pw.println(e); } pw.println("\n"); } br.close(); } catch (java.io.IOException e) { pw.println("EOF encountered"); } } catch (java.io.FileNotFoundException e) { pw.println("Cannot find file: " + input); } } private static boolean isOperator(String operator) { switch (operator) { case "+": case "-": case "*": case "/": case "$": return true; default: return false; } } private static String instruction(String oper) { switch (oper) { case "+": return "AD"; case "-": return "SB"; case "*": return "ML"; case "/": return "DV"; case "$": return "EX"; default: return "N/A"; } } public static void translate(String expression, PrintWriter pw) throws StackException, IOException { Stack variables = new Stack(); int tempNum = 1; String arg1; String arg2; String command; pw.println("Instructions in the Register:"); if (expression == null) { throw new IllegalArgumentException("null expression"); } expression = expression.trim(); if (expression.length() == 0) { throw new StackException("EMPTY STACK"); } int limit = expression.length() - 1; for (int i = 0; i < limit; i++) { String argument = expression.substring(i, i + 1); // if operator, pop arguments and evaluate if (isOperator(argument)) { if (variables.isEmpty()) { throw new StackException("EMPTY STACK"); } command = instruction(expression.substring(i, i + 1)); try { arg1 = variables.pop(); } catch (StackException e) { throw new StackException("EMPTY STACK ON ARG1"); } try { arg2 = variables.pop(); } catch (StackException e) { throw new StackException("EMPTY STACK ON ARG2"); } variables.push("TEMP" + tempNum); pw.println("LD " + arg2); pw.println(command + " " + arg1); pw.println("ST " + "TEMP" + tempNum); tempNum++; } else if (Character.isLetter(expression.charAt(i))) { variables.push(argument); // if variab.l+ng(i, i+1)); } else if (Character.isWhitespace(expression.charAt(i))) { // Ignore whitespace continue; } else { throw new StackException( "Unrecognized characterr: " + expression.charAt(i) + " at position: " + i); } } if (variables.isEmpty() == false) { while (variables.isEmpty() == false) { if (variables.pop().startsWith("TEMP") == false) { throw new StackException("Leftover variables after evaluation."); } } } }}这是输出文件的内容。 --- EVALUATION BEGINS ---EXAMPLE 1:Postfix Expression: AB+C-Instructions in the Register:LD AAD BST TEMP1ERROR: Invalid expression encountered: exitinggnrltsts.StackException: Leftover variables after evaluation.EXAMPLE 2:Postfix Expression: ABC+-Instructions in the Register:LD BAD CST TEMP1ERROR: Invalid expression encountered: exitinggnrltsts.StackException: Leftover variables after evaluation.EXAMPLE 3:Postfix Expression: AB-C+DEF-+$Instructions in the Register:LD ASB BST TEMP1LD TEMP1AD CST TEMP2LD ESB FST TEMP3LD DAD TEMP3ST TEMP4EXAMPLE 4:Postfix Expression: ABCDE-+$*EF*-Instructions in the Register:LD DSB EST TEMP1LD CAD TEMP1ST TEMP2LD BEX TEMP2ST TEMP3LD AML TEMP3ST TEMP4LD EML FST TEMP5EXAMPLE 5:Postfix Expression: ABC+*CBA-+*Instructions in the Register:LD BAD CST TEMP1LD AML TEMP1ST TEMP2LD BSB AST TEMP3LD CAD TEMP3ST TEMP4EXAMPLE 6:Postfix Expression: ABC+/CBA*+Instructions in the Register:LD BAD CST TEMP1LD ADV TEMP1ST TEMP2LD BML AST TEMP3ERROR: Invalid expression encountered: exitinggnrltsts.StackException: Leftover variables after evaluation.EXAMPLE 7:Postfix Expression: AB-*CBA+-*Instructions in the Register:LD ASB BST TEMP1ERROR: Invalid expression encountered: exitinggnrltsts.StackException: EMPTY STACK ON ARG2EXAMPLE 8:Postfix Expression: ABC-/BA-+/Instructions in the Register:LD BSB CST TEMP1LD ADV TEMP1ST TEMP2LD BSB AST TEMP3LD TEMP2AD TEMP3ST TEMP4EXAMPLE 9:Postfix Expression: ABC+$CBA-+*Instructions in the Register:LD BAD CST TEMP1LD AEX TEMP1ST TEMP2LD BSB AST TEMP3LD CAD TEMP3ST TEMP4EXAMPLE 10:Postfix Expression: AB0+/CBA+-/Instructions in the Register:ERROR: Invalid expression encountered: exitinggnrltsts.StackException: Unrecognized characterr: 0 at position: 2EXAMPLE 11:Postfix Expression: ABC*+DE-/Instructions in the Register:LD BML CST TEMP1LD AAD TEMP1ST TEMP2LD DSB EST TEMP3EXAMPLE 12:Postfix Expression: AB#CD@EFInstructions in the Register:ERROR: Invalid expression encountered: exitinggnrltsts.StackException: Unrecognized characterr: # at position: 2 --- EVALUATION COMLETE ---关于java - 如何将堆栈中的内容打印到文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60445253/
10-11 17:13