我必须创建一个程序来模拟计算器。我们必须在Operator类中使用hashmap,但我不知道如何解决这个问题。 我理解的基本逻辑是。我们发送程序一个简单的表达式,如1 + 2-3 * 4/5。然后程序将其分成两个堆栈。一个有操作符,一个有操作数。在划分字符时,我们必须检查操作符的哈希映射,然后将其推送到堆栈,这就是我被困住的地方。如何/在何处放置/使用hashmap?我的代码如下:
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
非常感谢任何帮助/澄清。 谢谢。
答案 0 :(得分:1)
有几件事......
1)HashMap
类是通用的,可以使用类型参数使其更容易使用:HashMap<String, Operator>
。
2)每次调用Operator
方法时,都会在哈希映射中添加check
s的新实例。这些实例只是覆盖旧实例,但这不是您想要的行为。哈希映射的初始化(所有operators.put
语句)应该在static initializer中进行。这样,它只发生一次。
3)您需要从哈希地图中检索您的真正长评论(&#34;我在这里检查......&#34;)的位置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));
推到你的筹码上。