Come potrei progettare uno stack che oltre a   push()    e   pop()   , ha anche una funzione min che restituisce l'elemento minimo?    min()    deve operare in una grande O (1) volta 
 Come potrei progettare uno stack che oltre a   push()    e   pop()   , ha anche una funzione min che restituisce l'elemento minimo?    min()    deve operare in una grande O (1) volta 
 Hai bisogno di una pila aggiuntiva di minimi. In   push   , se il nuovo elemento è minore o uguale alla cima del min-stack, spingilo anche lì. In   pop   , se l'elemento popped è uguale alla parte superiore del minstack, fai un salto anche da lì. 
Come sottolineato da altri, è necessario creare un altro gruppo di minimi. Tecnicamente questo sarebbe ancora O (1), ma il suo spazio sarebbe moltiplicato per un fattore costante di due. Questa è un'implementazione python usando liste:
class Empty(Exception):
    pass
class MinStack(object):
    def __init__(self):
        self._data = []
        self._min_stack = []
    def __len__(self):
        return len(self._data)
    def is_empty(self):
        return len(self._data) == 0
    def push(self, x):
        if self.is_empty():
            self._min_stack.append(x)
        elif x <= self._min_stack[0]:
            self._min_stack.insert(0,x)
        self._data.append(x)
    def pop(self):
        if self.is_empty():
            raise Empty('Stack is empty')
        if self._min_stack[0] == self._data[-1]:
            del self._min_stack[0]
        return self._data.pop() 
    def top(self):
        if self.is_empty():
            raise Empty('Stack is empty')
        return self._data[-1]
    def getMin(self):
        return self._min_stack[0]
if __name__ == '__main__':
    obj = MinStack()
    for i in [0,1,0]:
        obj.push(i)
    obj.getMin()
    obj.pop()
    obj.getMin()