Math 随机生成有效的中缀算术表达式

Math 随机生成有效的中缀算术表达式,math,expression,infix-notation,Math,Expression,Infix Notation,对于我的程序,我需要生成具有可自定义复杂性的有效中缀表达式。问题是我想不出一种方法来防止被零除,浮点答案和否定答案 为了避免负面回答,我采取了一种肮脏的方法。也就是说,生成一个表达式,对其求值,如果结果为负,则再次生成。以下是一些您应该知道的事情: inToPost()是一种将生成的中缀表达式转换为后缀进行计算的方法 复杂程度看起来你已经处理好了(b)和(c)两种情况。由于您的操作数从来都不是0,我想唯一可能违反(a)的是,如果添加的括号恰好包含零值,并且前面的运算符是除法。如果您将intost

对于我的程序,我需要生成具有可自定义复杂性的有效中缀表达式。问题是我想不出一种方法来防止被零除,浮点答案和否定答案

为了避免负面回答,我采取了一种肮脏的方法。也就是说,生成一个表达式,对其求值,如果结果为负,则再次生成。以下是一些您应该知道的事情:

  • inToPost()是一种将生成的中缀表达式转换为后缀进行计算的方法

  • 复杂程度看起来你已经处理好了(b)和(c)两种情况。由于您的操作数从来都不是0,我想唯一可能违反(a)的是,如果添加的括号恰好包含零值,并且前面的运算符是除法。如果您将
    intost()
    修改为接受子表达式,则可以检查这种情况:

    if(braceOpen > 0 && infix.get(braceOpen) == Operator.DIVISION && 
            evaluate(inToPost(infix.subList(braceOpen, braceOpen + 3))) == 0) {
        // Put parentheses elsewhere, or cancel
    }
    

    为此,我可以将内部的运算符从-更改为+。我真的觉得我做得不对。一次又一次地生成表达式直到+answer出现当我遇到像这样有复杂约束的情况时,我通常会发现生成许多选项并过滤掉那些满足约束的选项会导致比尝试在约束内生成更干净的代码。
    if(braceOpen > 0 && infix.get(braceOpen) == Operator.DIVISION && 
            evaluate(inToPost(infix.subList(braceOpen, braceOpen + 3))) == 0) {
        // Put parentheses elsewhere, or cancel
    }