Java 后缀计算器,如何处理连续3个数字?

Java 后缀计算器,如何处理连续3个数字?,java,illegalargumentexception,postfix-notation,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 '*':

以下是我目前的代码:

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();
}
公共类后缀计算器{
私有堆栈;
私人浮动结果;
专用布尔等运算符(字符op){
布尔算子;
开关(op){
格“+”:
案例'-':
案例“*”:
案例“/”:
案例‘^’:
运算符=真;
打破
违约:
运算符=false;
中断;}
返回运算符;
}
私有布尔函数(字符串函数){
字符串[]函数={“sin”、“cos”、“max”};

对于(inti=0;i对于这样的计算器,应该使用堆栈。每个数字都是一个推送,每个操作都有相应的操作

st = []
while input:
  if isanumber(input.next()): st.push(input.consume())
  else: #its an operator
    #note this may be wrong for operators that have a specific order
    if(input.next() == "+"): 
      stack.push(stack.pop() + stack.pop())
    # more operations
    input.consume()
print(st)
这将是一个粗略的python操作,在这个例子中,我在做决定之前先看一个标记

编辑:


可能应该在发布之前阅读您的代码,无论如何,您必须始终回推计算出的数字,并尝试将代码简化为“函数”和“数字”制作同时执行.Regex和.Regex的函数对于这类事情也很有用,例如.Regex是的,一个堆栈。而且可以使用数组和计数器轻松实现一个简单的堆栈——不需要使用复杂的类

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

Push是update A[i]和increment i。Pop是decreation i,reference A[i]。“8 9+”是Push(8),Push(9),弹出最上面的两个元素,将它们相加,推送结果。请注意,永远不会推送运算符,只推送操作数/结果

“2 3 4*-”将是推(2),推(3),推(4),弹出顶部2,乘法,推结果,弹出2,减法,推结果

“7 6+cos”将是推(7),推(6),弹出两个,添加,推结果,弹出一个,执行“cos”,推结果

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


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

谢谢您的帮助。我已经实现了一个堆栈,我正在按我认为的顺序推送它,但出于某种原因,2 3 4*-正在执行4-(2*3)取而代之的是,在我检查它是函数还是运算符后,我将令牌推入堆栈,但我是否跳过了某些操作或以错误的顺序进行了操作?@Akaraka-听起来(没有试图破译您的代码)您正在推送运算符(或函数)使用此方案,您永远不会推送运算符/函数——只推送值。(并且,正如另一篇文章所指出的,您对待运算符和函数完全相同。)我查看了我的代码,我认为我没有将运算符/函数放入堆栈,因为我在放入堆栈之前先检查它是函数还是运算符……我是否忽略了什么?谢谢你的帮助!@Akaraka--看一下你的代码,我没有看到任何明显的东西。(但请看我的建议。)您应该专注于为什么在识别“*”后不立即计算(3*4)例如,添加几个System.out.println调用以遵循代码的操作。为了统一性/可理解性,
result
应该是本地的,
computeOperator
应该返回分配给
result
的值。它有两个函数——computeMonadic和computeDiadic。处理max和您的“运算符”在computeDiadic中。用isMonadic或isDiadic替换等运算符。(无需使用字符——只需将所有运算符/函数名视为字符串。)如果你想变得有趣,你可以拥有一个
操作符类或诸如此类的类,并为你拥有的每个操作符/函数创建子类。构建一个操作符子类数组并对其进行索引,以找到你的操作。(但这将是“额外的学分”。)