Implementazione di una funzione aggiuntiva per impilare la struttura dei dati

0

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

    
posta Ravindu De Silva 04.02.2017 - 16:27
fonte

2 risposte

2

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ì.

    
risposta data 04.02.2017 - 17:14
fonte
1

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()
    
risposta data 07.08.2017 - 20:10
fonte

Leggi altre domande sui tag