Jump to content

Balanced brackets: Difference between revisions

Line 1,577:
(recur coll (pop stack))))
(zero? (count stack)))))</lang>
 
There are other ways to express the <code>balanced?</code> function.
 
* We can use <code>reduce</code> to consume the sequence:
:<lang Clojure>(defn balanced? [s]
(empty?
(reduce
(fn [stack first]
(case first
\[ (conj stack \[)
\] (if (seq stack)
(pop stack)
(reduced [:UNDERFLOW]))))
'()
s)))</lang>
 
* Only <code>[</code>s are put on the stack. We can just count the unmatched ones.
:<lang Clojure>(defn balanced? [s]
(let [opens-closes (->> s
(map {\[ 1, \] -1})
(reductions + 0))]
(and (not-any? neg? opens-closes) (zero? (last opens-closes))))) </lang>
 
Output:
Line 1,582 ⟶ 1,604:
<pre>user> (->> (range 10)
(map gen-brackets ,)
(map (juxt identity balanced?) ,) vec)
vec)
[["" true]
["[]" true]
10

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.