Question

I have no clue what I am supposed to be doing here, but I think I have most of my code good. I can only edit code inside the Evaluate() method. Pls help.

Here is my class with my main method

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

}

And Here is my Post Fix Evaluator class:

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

Thanks

Was it helpful?

Solution

I can't see you move forward in the tokenizer. You call nextToken just once, outside the loop. The rest of the code seems to indicate that evaluate should consume the entire expression, So nextToken needs to be called inside the loop.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top