Leetcode 716 Solution

This article provides solution to leetcode question 716 (max-stack)

https://leetcode.com/problems/max-stack

Solution

class MaxStack:

    def __init__(self):
        self.values = []
        self.max_values = []

    def push(self, x: int) -> None:
        self.values.append(x)
        if not self.max_values:
            self.max_values.append(x)
        else:
            self.max_values.append(max(x, self.max_values[-1]))

    def pop(self) -> int:
        ans = self.values[-1]
        self.values.pop()
        self.max_values.pop()
        return ans

    def top(self) -> int:
        return self.values[-1]

    def peekMax(self) -> int:
        return self.max_values[-1]

    def popMax(self) -> int:
        i = len(self.values) - 1

        elements_to_put_back = []
        while i >= 0 and self.values[i] != self.max_values[i]:
            elements_to_put_back.append((
                self.values.pop(),
                self.max_values.pop(),
            ))
            i -= 1

        ans = self.values[-1]
        self.values.pop()
        self.max_values.pop()

        for value, max_value in reversed(elements_to_put_back):
            self.push(value)

        return ans

# Your MaxStack object will be instantiated and called as such:
# obj = MaxStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.peekMax()
# param_5 = obj.popMax()