Java中替换嵌套While循环的替代方法

Java中替换嵌套While循环的替代方法,java,while-loop,nested-loops,Java,While Loop,Nested Loops,我尝试使用以下代码在Java中计算数学表达式: public double applyOp(char op,double b,double a) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/':

我尝试使用以下代码在Java中计算数学表达式:

public double applyOp(char op,double b,double a)
{
    switch (op)
    {
        case '+':
            return a + b;
        case '-':
            return a - b;
        case '*':
            return a * b;
        case '/':
            return a / b;
    }
    return 0;
}

public boolean hasPrecedence(char op1,char op2)
{
    return (op1 != '*' && op1 != '/') || (op2 != '+' && op2 != '-');
}

public double evaluate(String input) {
    Stack<Double> values = new Stack<>();
    Stack<Character> ops = new Stack<>();
    int stringIndex = 0;

    while (stringIndex < input.length())
    {
        StringBuilder multiDigitsNumber = new StringBuilder();

        // If the input is number put to stack values
        if (input.charAt(stringIndex) >= '0' && input.charAt(stringIndex) <= '9')
        {
            while (stringIndex < input.length() && input.charAt(stringIndex) >= '0' && input.charAt(stringIndex) <= '9')
            {
                multiDigitsNumber.append(input.charAt(stringIndex++));
            }
            values.push(Double.parseDouble(multiDigitsNumber.toString()));
        }

        // If the input is operator put to stack ops
        else
        {
            while (!ops.empty() && hasPrecedence(input.charAt(stringIndex),ops.peek()))
            {
                values.push(applyOp(ops.pop(),values.pop(),values.pop()));
            }
            ops.push(input.charAt(stringIndex++));
        }
    }

    // Execute remain operator in stack values
    while (!ops.empty()) {
        values.push(applyOp(ops.pop(), values.pop(), values.pop()));
    }

    // The final number in stack value is result
    return values.pop();
}
公共双应用程序(字符操作、双b、双a)
{
开关(op)
{
格“+”:
返回a+b;
案例'-':
返回a-b;
案例“*”:
返回a*b;
案例“/”:
返回a/b;
}
返回0;
}
公共布尔值优先(char op1,char op2)
{
返回(op1!='*'&&op1!='/')| |(op2!='+'&&op2!='-');
}
公共双重求值(字符串输入){
堆栈值=新堆栈();
堆栈操作=新堆栈();
int-stringIndex=0;
while(stringIndex如果(input.charAt(stringIndex)>='0'&&input.charAt(stringIndex)='0'&&input.charAt(stringIndex)='0'&&input.charAt(stringIndex)您可以像这样使用正则表达式

if (input.charAt(stringIndex) >= '0' && input.charAt(stringIndex) <= '9')
{
    String number = input.substring(stringIndex).replaceAll("^(\\d+).*", "$1");
    values.push(Double.parseDouble(number));
    stringIndex += number.length();
}

if(input.charAt(stringIndex)>=“0”和&input.charAt(stringIndex)看一看字符串标记器如果你的方法行得通,为什么还要修改它?它看起来很可读。@NomadMaker我试图重构这个方法使它更简单,目标是尽量不使用嵌套的while循环为什么?它已经足够简单了。嵌套的while循环很常见。@HoángViệ您没有验证表达式计算的输出。假设输入字符串是中缀符号表达式。
if (input.charAt(stringIndex) >= '0' && input.charAt(stringIndex) <= '9')
{
    String number = input.substring(stringIndex).replaceAll("^(\\d+).*", "$1");
    values.push(Double.parseDouble(number));
    stringIndex += number.length();
}