用Java标记中缀字符串

我正在Java中实现Shunting Yard算法 ,作为我的AP计算机科学课程的一个副项目。 我在Javascript中实现了一个简单的算法,只有基本的算术表达式(加法,减法,乘法,除法,取幂)。 要将其拆分为数组,我所做的是找到每个运算符( +-*/^ ),以及数字和括号,然后在它们周围放置一个空格,然后将其拆分为数组。 例如,中缀字符串4+(3+2)将被制成4 + ( 3 + 2 ) ,然后在空格上分割。

但是,我觉得这种方法非常慢,当你开始添加正弦,余弦,正切,绝对值等数学函数时,它实现起来越来越难以实现。

将像sin(4+3)-8这样的字符串分成数组["sin","(" 4,"+",3,")","-",8]什么?

我可以使用正则表达式,但我并不是很了解它们,我正在努力学习它们,所以如果这对他们来说是最好的解决方案,请问回答者能解释它的作用吗?

尝试.split ing正则表达式

 (?<=[^\.a-zA-Z\d])|(?=[^\.a-zA-Z\d]) 

它会将字符串拆分在任何前面或后面跟着非字母数字字符或句点的地方。

  • (?<=[^\.a-zA-Z\d])是一个积极的外观 。 如果前面的字符串与(?<=...)包含的子正则表达式匹配,它匹配两个字符之间的位置。
    • [^\.a-zA-Z\d]是一个否定的字符类 。 它匹配[^...]未包含的单个字符
      • \. 匹配角色.
      • az匹配az之间a任何小写字符。
      • AZ是相同的,但对于大写。
      • \d相当于[0-9] ,因此它匹配任何数字。
  • | 相当于“或” 。 它使正则表达式与正则表达式的前一半或后一半匹配。
  • (?=[^\.a-zA-Z\d])与正则表达式的前半部分相同,只是它是一个正向前瞻 。 如果以下字符串与(?=...)包含的子正则表达式匹配,则它匹配两个字符之间的位置。

您可以在java中实现此正则表达式,如下所示:

 String str = "sin(4+3)-8"; String[] parts = str.split("(?<=[^\\.a-zA-Z\\d])|(?=[^\\.a-zA-Z\\d])"); 

结果:

 ["sin","(" 4,"+",3,")","-","8"]