Min stack: both internal stacks after every operation ===================================================== push 5 values=[5] mins=[5] (new or equal minimum, also pushed on mins) push 3 values=[3, 5] mins=[3, 5] (new or equal minimum, also pushed on mins) push 7 values=[7, 3, 5] mins=[3, 5] push 3 values=[3, 7, 3, 5] mins=[3, 3, 5] (new or equal minimum, also pushed on mins) getMin values=[3, 7, 3, 5] mins=[3, 3, 5] getMin() = 3 pop -> 3 values=[7, 3, 5] mins=[3, 5] (it was the minimum, mins popped too) getMin values=[7, 3, 5] mins=[3, 5] getMin() = 3 pop -> 7 values=[3, 5] mins=[3, 5] getMin values=[3, 5] mins=[3, 5] getMin() = 3 pop -> 3 values=[5] mins=[5] (it was the minimum, mins popped too) getMin values=[5] mins=[5] getMin() = 5 getMin results: [3, 3, 3, 5] (identical for MinStack and EncodedMinStack)