【问题标题】:Checking for matching parenthesis检查匹配的括号
【发布时间】:2014-10-01 16:10:21
【问题描述】:

我正在尝试编写一个代码,在给定括号列表的情况下,我将检查订单是否有效。

为简单起见,定义了以下数据类型。

datatype par = LPAR | RPAR
 type pList = par list

到目前为止我所拥有的是:

fun valid(nil:plist): bool = true
| valid([Lpar]) = false
| valid([Rpar]) = false
| valid([Lrap,Rpar) = true
| valid(L::L1) =

例如,“(()()”--> [Lpar,Lpar,Rpar,Lpar,Rpar] 将返回 false 可以看到括号是字符串格式的。我很困惑,因为我必须检查两件事:左边(等于左边)和每个(匹配一个)。如果是这样,那么我将需要创建一些辅助函数。

您能否向我提供有关我的辅助函数应该是什么或更好的实现方式的信息? 太棒了

【问题讨论】:

  • 第一个模式没问题。第二,第三和第四模式相当无用,尽管在形式上没有错误。您似乎试图将括号列表视为一个整体。尝试表达这个规则:右括号出现在左括号之后,并且如此递归(在开闭对内,可能有嵌套的开闭对)。这是作业吗?

标签: sml smlnj


【解决方案1】:

我找到了一种通过计算括号来解决我的问题的方法。逻辑是这样的:

我从 0 开始,如果我找到一个左 p,我加 1,否则我减 1。一旦我输入 -1,我立即返回 false,因为我不能让右 p 先出现。然后我递归。如果最终输出为 0,则为真,因为这意味着每个左 p 都匹配一个右 p。

Q.E.D

【讨论】:

    【解决方案2】:

    我没有在 repl 中尝试过,但它应该看起来像这样

    fun valid_paren xs : bool = 
    fun aux (xs, ctr) = case xs of
        [] => ctr = 0
      | (x:xs') => case x of 
               '(' => aux (xs', ctr+1)
               ')' => aux (xs', ctr-1)
                _  => aux (xs', ctr)
    in
      aux (xs, 0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 2020-06-05
      相关资源
      最近更新 更多