Всякий раз, когда вы push
попадаете в стек, вы также проверяете, меньше ли этот элемент, чем предыдущий минимум, который сохраняется поверх minStack
, а также подсчитывает, сколько этого элемента находится в стеке.
Если элемент меньше, то вы нажимаете на него (со счетом 1) на minStack
. Если это то же самое, вы увеличиваете количество этого элемента на единицу.
Каждый раз, когда вы вытаскиваете предмет, если это самый маленький предмет в стеке (т.е. == minStack[-1][0]
), вы уменьшаете количество самого маленького предмета. Если это количество становится равным нулю, вы вытаскиваете предмет из minStack
. Теперь самый маленький предмет в стеке - это то, что было до того, как был добавлен первый предмет этого меньшего предмета. Это связано с тем, что для того, чтобы отбросить этот первый экземпляр самого маленького элемента, нам сначала нужно было выложить все на него сверху, по сути, свернув стек обратно к моменту времени, когда был добавлен самый маленький элемент.
PS: Когда вы пишете свои собственные реализации стека, знайте, что любой стек, который не возвращает элементы, которые он pop
s, действует очень странно.