我必须创建一个程序来模拟计算器。我们必须在Operator类中使用哈希表,但是我不确定该如何做。
据我了解,这是基本逻辑。我们向程序发送一个简单的表达式,例如1 + 2-3 * 4/5。然后,程序会将其分为两个堆栈。一个带运算符,一个带操作数。在划分字符时,我们必须检查运算符的哈希图,然后将其推入堆栈,这就是我遇到的问题。如何/在何处放置/使用哈希图?我的代码如下:
import java.util.*;
public class Evaluator {
private Stack<Operand> opdStack;
private Stack<Operator> oprStack;
public Evaluator() {
opdStack = new Stack<Operand>();
oprStack = new Stack<Operator>();
} // end constructor
public int eval(String expr) {
String tok;
expr = expr + "!";
String delimiters = "+-*/#! ";
StringTokenizer st = new StringTokenizer(expr, delimiters, true);
while (st.hasMoreTokens()) {
tok = st.nextToken();
if(!tok.equals(" ")) {
if(Operand.check(tok)){
opdStack.push(new Operand(tok));
}
else{
if (!Operator.check(tok)) {
System.out.println("*****invalid token******\n");
System.exit(1);
} // end if
} // end else
} // end if
} // end while
return 0;
} // end eval
} // end Evaluator
abstract class Operator {
static HashMap operators = new HashMap();
public abstract int priority();
static boolean check(String tok) {
boolean result = false;
operators.put("#", new PoundOperator());
operators.put("!", new ExclamationOperator());
operators.put("+", new AdditionOperator());
operators.put("-", new SubtractionOperator());
operators.put("*", new MultiplicationOperator());
operators.put("/", new DivisionOperator());
if (operators.containsKey(tok)) {
result = true;
}
return result;
} // end check
public abstract Operand execute(Operand opd1, Operand opd2);
} // end Operator
任何帮助/澄清深表感谢。
谢谢。
最佳答案
几件事...
1)HashMap
类是通用类,可以使用类型参数使它更易于使用:HashMap<String, Operator>
。
2)每次调用Operator
方法时,都将check
的新实例添加到哈希映射中。这些实例只是覆盖了旧实例,但这不是您想要的行为。哈希映射(所有operators.put
语句)的初始化应在static initializer中进行。这样,它只会发生一次。
3)您需要在哈希表中当前您的长评论(“我在这里检查...”)处检索Operator
。怎么会这样好吧,operators
映射仅是私有包,因此您可能直接使用Operator.operators.get
,但我想这不是目的。我相信您想在Operator
类中使用单独的静态getter方法,例如:
abstract class Operator {
...
static Operator get(String token) {
return operators.get(token);
}
...
}
这样,您应该能够通过
Operator
之类的调用将oprStack.push(Operator.get(tok));
推入堆栈。