Scheme实现字符串括号平衡校验的代码运行异常,求修改方案
Scheme括号平衡校验代码调整方案
现有代码存在的问题
- cond分支语法错误:cond每个分支的标准结构为
(判断条件 执行语句),原代码错误将返回值#t/#f写在了and条件的参数列表中,导致分支返回逻辑异常。 - 类型匹配错误:
string->list将字符串转为字符列表,括号对应类型为字符(#\(、#\)),原代码用字符串"("/")"做相等判断,永远无法匹配到括号字符,计数逻辑完全不生效。 - 默认分支缺失
else关键字:原代码最后一个处理非括号字符的分支没有加else标识,未匹配到前面条件的场景执行逻辑混乱。 - 缺失负数提前终止逻辑:如果遍历过程中计数出现负数(右括号数量多于左括号),后续无论补充多少左括号都无法恢复平衡,原代码没有提前终止判断,会将
)(这类明显不平衡的场景误判为平衡。
修正后完整代码
(define (balanced? st) (define lst (string->list st)) (if (zero? (string-length st)) #t (counter lst 0))) (define (counter lst count) (cond ((< count 0) #f) ((and (zero? count) (null? lst)) #t) ((null? lst) #f) ((equal? (first lst) #\() (counter (cdr lst) (+ count 1))) ((equal? (first lst) #\)) (counter (cdr lst) (- count 1))) (else (counter (cdr lst) count))))
效果验证
- 输入
(balanced? "()")返回#t - 输入
(balanced? "(a(b)c)")返回#t - 输入
(balanced? ")(")返回#f - 输入
(balanced? "(()))(")返回#f
内容的提问来源于stack exchange,提问作者bsaget
相关产品推荐
相关产品推荐

