我必须创建一个程序来模拟计算器。我们必须在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));推入堆栈。

10-06 13:48
查看更多