design a stack that supports push, pop, top, and retrieving the minimum element in constant time