Balanced brackets: every step of four inputs ============================================ input: {[()]} firstMismatch = -1 read '{' at 0: push '}' waiting for (top first): } read '[' at 1: push ']' waiting for (top first): ] } read '(' at 2: push ')' waiting for (top first): ) ] } read ')' at 3: pop ')', matches waiting for (top first): ] } read ']' at 4: pop ']', matches waiting for (top first): } read '}' at 5: pop '}', matches waiting for (top first): (empty) end of input: waiting for (empty) -> balanced input: ([)] firstMismatch = 2 read '(' at 0: push ')' waiting for (top first): ) read '[' at 1: push ']' waiting for (top first): ] ) read ')' at 2: expected ']' -> NOT balanced input: ()) firstMismatch = 2 read '(' at 0: push ')' waiting for (top first): ) read ')' at 1: pop ')', matches waiting for (top first): (empty) read ')' at 2: stack is empty, nothing to close -> NOT balanced input: (() firstMismatch = 0 read '(' at 0: push ')' waiting for (top first): ) read '(' at 1: push ')' waiting for (top first): ) ) read ')' at 2: pop ')', matches waiting for (top first): ) end of input: waiting for ) -> NOT balanced, openers left over