用括号中的另一个替换正或负十进制或整数

时间:2014-01-01 16:12:24

标签: java calculator parentheses brackets

如何使用Java替换括号中的正或负十进制或整数?

我正在使用Java制作一个计算器,我发现当它们采用以下格式时很难处理括号:

(-x)(-y)
(x)(y)

正数或负数的其他组合只有当我必须并排括号而没有我的代码不适用的乘法符号时才能工作。 如果有一个更简单的方法使用Java正则表达式,那么我很乐意找到如何。 任何帮助是极大的赞赏! 这是我到目前为止处理括号的代码

setExpression(exp);
while(exp.contains("(") && exp.contains(")")){
    int lastOpen = exp.lastIndexOf("(");
    int nextClose = lastOpen + exp.substring(lastOpen+1).indexOf(")") + 1;
    //first close bracket after the last open bracket
    //treats the bracket as a separate expression and so checks it's validity
    if(sameNoBrackets() != ""){
        return sameNoBrackets();
    }
    setExpression(exp.substring(lastOpen+1, nextClose));
    result = checkExpression();

    if(!result.equals("")){
        //if true then there is an error message so program stops there
        return result;

    }else{
        String newText = calculateResult();
        lastOpen = exp.lastIndexOf("(");
        nextClose = lastOpen + exp.substring(lastOpen+1).indexOf(")") + 1;

        String lastChar = "";
        String nextChar = "";

        if(lastOpen > 0){
            lastChar = String.valueOf(exp.charAt(lastOpen-1));
        }

        if(nextClose + 2 <= exp.length()){
            nextChar = String.valueOf(exp.charAt(nextClose+1));
        }

        if(lastChar != ""){
            if(!"+-/*".contains(lastChar)){
                newText = "*"+newText;
            }
        }

        if(!"+-/*".contains(nextChar)){
            newText = newText+"*";
        }

        exp = exp.replace(exp.substring(lastOpen, nextClose+1), newText);
        //removes the bracket and replaces with the appropriate replacement text
    }
}
setExpression(exp);
//checks the validty of the expression onces the brackets have been removed
result = checkExpression();
if (result == ""){
    //calculates the answer if there is no error
    result = calculateResult(); 
}
//returns either the answer or the error message that has been generated
return result;  

2 个答案:

答案 0 :(得分:0)

查看数据结构Stack,它使您能够以更可行的块来解析术语,以便可以根据其优先级计算它们。所以乘法的问题也可以更好地解决,因为你知道在关闭括号之后必须来一个运算符,如果没有那么默认乘法或期末已达到。

通过这种方式,也可以解析嵌套的术语和括号,因为堆栈使您能够 解决至少是实现计算器所必需的常规语言。

括号问题的一个简单的解决方法是预处理你的术语文字并替换每一次出现的事件(用括号打开括号)*(这样你的解析器就不能处理)(条件。但是正如EJP和Miho已经说过的那样)您的实现将无法处理所有输入变体。

答案 1 :(得分:0)

问题实际上是你的整个技术都是错误的。

你需要查找Dijkstra shunting-yard算法,或递归下降表达式解析。

你根本不需要处理这个特殊情况:它自然而然地脱离了正确的实现。

你需要扔掉它然后重新开始。