class MinStack: def __init__(self): self.stack = [] self.minEl = None def push(self, x: int) -> None: node = Node(x) if self.minEl is None or node.value <= self.minEl.value: node.lastMin = self.minEl self.minEl = node self.stack.append(node) def pop(self) -> None: if len(self.stack) > 0: ret = self.stack[len(self.stack) - 1] if ret.value == self.minEl.value: self.minEl = self.minEl.lastMin self.stack = self.stack[0:len(self.stack) - 1] return ret.value return None def top(self) -> int: if len(self.stack) > 0: return self.stack[len(self.stack) - 1].value return None def getMin(self) -> int: return self.minEl.value def __str__(self): str_result = "" for x in self.stack: str_result += "\n" str_result += str(x) return str_result class Node: def __init__(self, x, lastMin = None): self.value = x self.lastMin = lastMin def __str__(self): return f"Value: {str(self.value)} Last Min: {str(self.lastMin)}" # Your MinStack object will be instantiated and called as such: values = [] obj = MinStack() obj.push(-2) obj.push(0) obj.push(-3) values.append(obj.getMin()) values.append(obj.pop()) values.append(obj.top()) values.append(obj.getMin()) print("Expected: [-3, -3, 0, -2]") print("Got:", values)