我想写一个函数,你输入一系列的分隔符,元组,和一个字符串,然后这个函数会根据我们输入的元组来检查字符串是否平衡,然后返回一个布尔值。
例如:
输入:balanceList [('[','}')] "[}"
输出:True
输入:balanceList [('{',')'] "{}"
输出:False
下面是我目前的代码:
balanceList :: [(Char, Char)] -> String -> Bool
balanceList pairs string = balanced string emptyStack
where
balanced [] stack = isEmpty stack
balanced (c:string) stack
|c `elem1` (map fst pairs) = balanced string (push c stack)
|c `elem1` (map snd pairs) = popTest (pop stack)
where
popTest Nothing = False
popTest (Just (x,s)) = x == c && balanced string s
balanced (_:string) stack = balanced string stack
当我输入balanceList [('[','}')] "[}"
时,得到的是False
而不是True
我该如何解决这个问题?
先谢谢你
2条答案
按热度按时间ql3eal8s1#
使用
push c stack
,你是在栈上压入左括号,而不是右括号,因此当你检查它是否是右括号时,你会检查当前字符是否与左括号相同。一个更简单的方法是将预期的右括号压入堆栈,这样就弹出了堆栈,类似于:
因此,我们首先检查堆栈和字符串是否都为空,然后返回
True
,如果堆栈和字符串都不为空,我们首先检查堆栈头c
和字符串的第一个字符是否匹配,如果匹配,我们弹出堆栈并在字符串的尾部递归,如果失败,我们检查第一个字符c
是否是pairs
的一个元素,然后得到需要压入堆栈的共括号c'
。mwyxok5s2#
问题出在这一行:
你在这堆东西里放了什么?