检查匹配的括号

时间:2014-09-27 23:07:28

标签: sml smlnj

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

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

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 您可以看到括号是字符串格式。我很困惑,因为我必须检查两件事:左边(等于左边)和每个(匹配a)。如果是这样,那么我将需要制作一些辅助函数。

您能否向我提供有关我的帮助功能应该是什么或更好地实现此信息的信息? TY

2 个答案:

答案 0 :(得分:1)

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

我从0开始,如果我找到左边的p我加1,其他明智的我减去1.一旦我输入-1,我立即返回假,因为我不能有一个正确的p先来。然后我递归。如果最终输出为0,则为真,因为这意味着每个左p匹配右p。

Q.E.D

答案 1 :(得分:0)

我没有在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)