java - Postfix计算器,如何处理连续3个数字?

标签 java illegalargumentexception postfix-notation

这是迄今为止我的代码:

public class PostfixCalculator {

   private Stack<Float> stack;
   private float result;

   private Boolean isOperator (char op){
    boolean operator;
    switch (op){
        case '+':
        case '-':
        case '*':
        case '/':
        case '^':
            operator = true;
            break;
    default:
        operator = false;
        break;}
    return operator;
}

private Boolean isFunction (String func){
    String[] functions = {"sin", "cos", "max"};
    for (int i=0; i<functions.length; i++){
        if (func.equals(functions[i]))
            return true; }
    return false;
}

private void computeOperator (float op1, float op2, char op){
    switch (op){
        case '+': 
            result = op1 + op2;
            break; 
        case '-': 
            result = op1 - op2;
            break;
        case '/': 
            result = op1/op2;
            break;
        case '*': 
            result = op1 * op2; 
            break;
        case '^': 
            result = (float) Math.pow(op1, op2);
            break;

        default:
            break;
    }   
}

public float calculate(String expr) throws IllegalArgumentException {
    result = 0;
    String token;
    Float makeit;
    char operator;
    float op1, op2, pushFloat;
    StringTokenizer calc=new StringTokenizer(expr);

    stack = new Stack<Float>();

    while (calc.hasNextToken()){
        token=calc.getNextToken();
        operator=token.charAt(0);

        if (!(this.isOperator(operator))){
            if (this.isFunction(token)){
                if (token.equals("sin")){
                    op1=stack.pop();
                    result = (float) Math.sin(op1);
                    stack.push(result);
                }
                else if (token.equals("cos")){
                    op1=stack.pop();
                    result = (float) Math.cos(op1);
                    stack.push(result);
                }
                else if (token.equals("max")){
                    op1=stack.pop();
                    op2=stack.pop();
                    result=Math.max(op1, op2);
                    stack.push(result);
                }

            }
            else {
                makeit = new Float(token);
                pushFloat = makeit.floatValue();
                stack.push(pushFloat);
            }

        }
        else {
            op1 = stack.pop();
            op2 = stack.pop();
            computeOperator (op1, op2, operator);
            stack.push(result);


        }
    }
    return stack.pop();
}

}

我想我已经掌握了它的基础知识,但是如何处理连续三位或更多数字的后缀计算,例如“2 3 4 * -”?任何帮助,将不胜感激。提前致谢!

最佳答案

是的,一个堆栈。人们可以使用数组和计数器轻松实现一个简单的堆栈 - 不需要使用花哨的类。

该数组将与您可以处理的最深嵌套表达式一样大(10 个元素应该足以解决几乎所有“真实”问题)。

推送是更新 A[i] 并增加 i。 Pop 是递减 i 并引用 A[i]。 “8 9 +”就是push(8),push(9),弹出最上面的两个元素,相加,压入结果。请注意,运算符永远不会推送,只会推送操作数/结果。

'2 3 4 * -' 将是推(2)、推(3)、推(4)、弹出前两个、乘法、插入结果、弹出两个、减法、插入结果。

“7 6 + cos”将是push(7)、push(6)、弹出2、添加、推送结果、弹出1、执行“cos”、推送结果。

如果您需要弹出一个元素并且计数器为零(例如,“7 +”——您想要弹出两次,但只能弹出一次),则会出错。如果用户表示“完成”并且堆栈中有多个元素,也会出现错误。

始终“显示”顶部元素,因为这是最后推送的值或结果。

关于java - Postfix计算器,如何处理连续3个数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12906700/

相关文章:

java - 在 "while expected"循环中出现 "do...while"错误

java - 在数据库中添加第二个表

java - 调用方法时要添加哪些参数

java - 在java中显示图像

Java:评估后缀表达式

java - 需要帮助在后缀评估上实现 Java 算法

java - 是什么导致我收到此 EmptyStackException?

java - TIBCO 上的 HTTPS 证书安装

java - 从静态外部 util 函数访问内部类

java - 使用目录路径创建新类型 "File"对象时出现无效 URL/非法参数异常