1

我不知道我应该在这里做什么,但我认为我的大部分代码都很好。我只能在 Evaluate() 方法中编辑代码。请帮忙。

这是我的主要方法的课程

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();
    }

}

这是我的 Post Fix Evaluator 类:

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;
    }
}

谢谢

4

1 回答 1

3

我看不到你在分词器中前进。你nextToken只调用一次,在循环之外。其余代码似乎表明评估应该消耗整个表达式,因此nextToken需要在循环内调用。

于 2014-03-06T05:59:19.237 回答