【问题标题】:A good way to parse the string "((1/2)/3/)4" and others like it [duplicate]解析字符串“((1/2)/3/)4”和其他类似字符串的好方法[重复]
【发布时间】:2014-12-03 11:29:29
【问题描述】:

假设我有四个数字 A、B、C、D。

有四种数学方法可以在它们之间使用运算符来排列它们。对于我的示例,我将使用除法运算符,但运算符可以是任何东西。

((A/B)/C)/D

A/(B/(C/D))

(A/(B/C))/D

A/((B/C)/D)

(A/B)/(C/D)

如果数字为 1、2、3、4,则结果将分别为 0.0416、0.375、0.375、6、0.666。

所以如果字符串是

因此,如果我要用任何数字替换 A、B、C 和 D,并用任何运算符替换除法运算符,我该如何解析它,从而得到正确的结果?

我这样做的方式是使用 switch 语句,并假设哪个运算符位于某些字符串索引处,这有效,但仅适用于括号并不重要的第一个。我可以为五种不同的组合中的每一种创建 5 种不同的解析方法,但似乎会有更好的方法,而且我的方法似乎会变得非常笨拙,因为我必须使用嵌套的 switch 语句。

例如,如果字符串是

012345678910

"A/((B/C)/D))

我会在 5 处为 char 应用 switch 语句。然后用 B 和 C 进行操作并将该变量存储到假设 X 中。然后在 char 8 处的 switch 语句,应用于 D,存储在 Y,在 1 处切换,应用,打印结果。然后重复这 40 行代码 5 次,改变一些东西。

这是最好的方法还是有更好的方法?

谢谢!

【问题讨论】:

    标签: java string parsing optimization


    【解决方案1】:

    这是一个经典的问题。如果您注意到语言本身实现了这一点。 您可能想阅读调车场算法 https://en.wikipedia.org/wiki/Shunting-yard_algorithm

    【讨论】:

    • 好答案,但可能应该是评论,因为基本上只包含链接的答案通常不受欢迎。
    • 谢谢。很高兴知道。反正也不是这个意思。只是想给纳坦坦坦一个更高层次的答案。这就是我在提问时喜欢得到的结果。
    • 我阅读了那个简短的 wiki 页面,但我并没有真正理解它。这是我对 CSE 课程的介绍,所以可能超出了我的范围?
    • 对不起,我不知道这是上课用的。一般问题通过定义运算符的顺序来解决,然后遍历表达式并运行该页面中的算法。如果只有 / * 和 (),你的问题会容易一些。你可以很容易地在网上找到它的 Java 实现。但是因为这是家庭作业,如果你有时间尝试一下,那就太好了。对您来说简单的解决方案是只能弄清楚括号运算符何时关闭
    • 基本上开始读括号。总结尽可能多的(你看到的和每当你看到 a )到最后一个(并进行计算。保留数字,现在你有一个更短的表达式。你也可以递归地编写程序
    【解决方案2】:

    假设我可以完全控制输入。我只需用它们的数值查找/替换公式中的字母,然后通过ScriptEngineeval 字符串替换为outlined here。这肯定有危险,你必须小心,但如果可能的话,这似乎是一种更简单的解决方案,计算机实际上正在做艰苦的工作。

    【讨论】:

      【解决方案3】:

      如何使用堆栈创建一个后缀表达式然后计算它,因为后缀表达式中不会有任何括号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-22
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多