2014-03-06 33 views
1

我不知道我應該在這裏做什麼,但我認爲我的代碼大部分都很好。我只能編輯Evaluate()方法中的代碼。請幫助。我不能讓我的PostFix評估器正常工作

這裏是我的課我的主要方法

package labs.lab3; 

import java.util.Scanner; // Needed for the Scanner 
import java.io.*;   // Needed for the File and IOException 

public class TestDriver { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) throws IOException { 
     System.out.printf("%-30s", "Postfix Expression"); 
     System.out.printf("%-30s", "Evaluation Result"); 
     System.out.println(); 
     String filename = "./src/labs/lab3/PostfixExpressions.txt"; 

     File file = new File(filename); 
     Scanner inputFile = new Scanner(file); 

     while (inputFile.hasNext()) 
     { 

      String expression = inputFile.nextLine(); 
      System.out.printf("%-30s", expression); 
      PostfixEvaluator evaluator = new PostfixEvaluator(expression); 
      System.out.printf("%-30s" , evaluator.Evaluate()); 
      System.out.println(); 
     } 

     inputFile.close(); 
    } 

} 

,這裏是我的帖子修復計算器類:

package labs.lab3; 

import java.util.Stack; 
import java.util.EmptyStackException; 
import java.util.StringTokenizer; 

public class PostfixEvaluator 
{ 
    private Stack<Integer> stack; 
    private String expression; 
    private String token; 

    public PostfixEvaluator(String e) 
    { 
     stack = new Stack<Integer>(); 
     expression = e; 
    } 

     // Evaluate the postfix expression and return the evaluation result 
    public int Evaluate() 
    { 
     int op1,op2; 
     int result; 
     StringTokenizer st = new StringTokenizer(expression);//split the expression into tokens 
     String token=st.nextToken(); 

      while (st.hasMoreTokens()){ 

       if (Character.isDigit(token.charAt(0))) { 
       int value = Integer.parseInt(token); 
       stack.push(value);    
       } 

       else if (!Character.isDigit(token.charAt(0))) { 
        op1=stack.pop(); 
        op2=stack.pop(); 
        result = Calculate(op1,op2,token.charAt(0)); 
        stack.push(result); 

       } 

      } 
      int answer = stack.pop(); 
      return answer; 








    } 

    // Perform an operation on the two operands 
    public int Calculate(int operand1, int operand2, char operation) 
    { 
     int result = 0; 

     switch (operation) 
     { 
     case '+': 
      result = operand1 + operand2; 
      break; 
     case '-': 
      result = operand1 - operand2; 
      break; 
     case '/': 
      result = operand1/operand2; 
      break; 
     case '*': 
      result = operand1 * operand2; 
      break; 
     case '%': 
      result = operand1 % operand2; 
      break; 
     } 
     return result; 
    } 
} 

感謝

回答

3

我看不到你在前進標記生成器。您只需撥打nextToken只需 一次,在循環之外。代碼的其餘部分似乎表明,評估 應消耗整個表達式,因此需要在 循環內調用nextToken