将字符串中的连续数字值转换为数字格式

Converting consecutive digit values in String to Numberic format

我正在开发计算器应用程序。

我有 Class CalcLogic,它处理 App:

中的所有逻辑
public class CalcLogic {

    private CharacterStack characterStack;
    private DigitStack digitStack;
    private StringStack stringStack;


    public CalcLogic() {
        characterStack = new CharacterStack();
        digitStack = new DigitStack();
        stringStack = new StringStack();
    }

    
    public void convertString(String s) {
        String[] arr = s.split("");


        for (int i = 0; i < arr.length; i++) {
            stringStack.push(arr[i]);
        }

        while (!stringStack.isEmpty()) {
            if ((!stringStack.isEmpty()) && stringStack.peek().matches("[0-9]+")) {
                digitStack.push(Double.valueOf(stringStack.pop()));
            }
            if ((!stringStack.isEmpty()) && stringStack.peek().matches("[(+=\-*/^)]+")) {
                characterStack.push(stringStack.pop());
            }
        }
        
        System.out.println(digitStack);
        System.out.println(characterStack);
    }

}

得到了MainApp

 public static void main(String[] args) {
        CalcLogic calcLogic = new CalcLogic();
        calcLogic.convertString(new String("1+2*(3+4/2-(1+2))*2+1"));
    }
}

问题在于转换数字:

 if ((!stringStack.isEmpty()) && stringStack.peek().matches("[0-9]+")) {
            digitStack.push(Double.valueOf(stringStack.pop()));
  }

来自 String 的数字:

String s = "1+2*3(30+4/2-(10+2))*2+1";

将像这样被推入 digitStack:

1.0 2.0 2.0 1.0 2.0 4.0 [0.0 3.0] 2.0 1.0

因为它将每个元素从 String 中分离出来。

digitStack 中的预期输出应该是:

1.0 2.0 2.0 1.0 2.0 4.0 30.0 2.0 1.0

我怎样才能实现它?

问题来自 String[] arr = str.split(""); 它逐个字符地拆分。
你可以用这个代码检查它

        String str = "1+2*(3+4/2-(1+2))*2+1";
        String[] arr = str.split("");
        
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

有关如何使用 java 拆分数学表达式的解决方案,请查看此 Whosebug 条目: 即:

String[] arr = str.split("(?<=\d)(?=\D)|(?<=\D)(?=\d)");

有关 split("(?<=\d)(?=\D)|(?<=\D)(?=\d)") 的详细信息,请阅读 Whosebug 条目:
祝你好运。