我不知道我应该在这里做什么,但我认为我的大部分代码都很好。我只能在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;
}
}
由于
答案 0 :(得分:3)
我无法看到你在标记器中前进。你只需致电nextToken
一次,在循环之外。其余的代码似乎表明评估
应该使用整个表达式,因此需要在内部调用nextToken
循环。