Eight classic mistakes, each reproduced
=======================================

1. balanced brackets by counting each kind, with no stack
   input "([)]":  counts-only = true   stack = false
   every count ends at zero, but the ] arrives while the ( is not the innermost open bracket

2. min stack that compares boxed Integers with ==
   push [10, 20, 5], pop, getMin():  broken = 10   correct = 10
   push [1000, 2000, 500], pop, getMin():  broken = 500   correct = 1000
   Integer.valueOf caches -128..127, so small values share one object and == happens to work

3. min stack that pushes onto the min stack only on a strictly smaller value
   push 3, push 3, pop, getMin():  strict -> NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.Deque.peek()" is null
   correct -> 3   (the stack still holds one 3)

4. encoded min stack with int differences instead of long
   push Integer.MIN_VALUE, push Integer.MAX_VALUE, top():  int diffs = -2147483648   long diffs = 2147483647
   MAX_VALUE - MIN_VALUE does not fit in an int, wraps to -1, and -1 looks like "new minimum"

5. next greater element popping on <= instead of <
   input [2, 2, 3]:  buggy = [2, 3, -1]   correct = [3, 3, -1]
   the first 2 is told its next greater element is 2

6. largest rectangle without the final height-0 bar
   input [2, 4]:  buggy = 0   correct = 4
   nothing ever pops the bars that are still on the stack when the loop ends

7. queue from two stacks that pours on every dequeue
   enqueue 1, 2; dequeue; enqueue 3; dequeue:  first = 1 (ok), second: broken = 3   correct = 2
   the 3 was poured on top of the 2 that was still waiting in the output stack

8. popping an empty structure: both conversions throw NoSuchElementException, as ArrayDeque.pop does
