class QueueWithMin(object): def __init__(self): self._push_stack = StackWithMin() self._pop_stack = StackWithMin() def push(self, x): self._push_stack.push(x) def pop(self): if len(self._pop_stack) == 0: self._push_to_pop() return self._pop_stack.pop() def _push_to_pop(self): assert len(self._pop_stack) == 0 while len(self._push_stack) > 0: self._pop_stack.push(self._push_stack.pop()) def min(self): m1 = self._push_stack.min() m2 = self._pop_stack.min() if m1 is None: return m2 if m2 is None: return m1 return min(m1, m2)
def testPushAndPop2(self): stack = StackWithMin() stack.push(10) stack.push(5) self.assertEqual(stack.pop(), 5) stack.push(9) stack.push(3) self.assertEqual(stack.pop(), 3)
def testPushAndPop(self): stack = StackWithMin() stack.push(1) stack.push(2) stack.push(3) stack.push(4) self.assertEqual(stack.pop(), 4) self.assertEqual(stack.pop(), 3) self.assertEqual(stack.pop(), 2) self.assertEqual(stack.pop(), 1)
def test_stack(self): stack = StackWithMin() stack.push(1) self.assertEqual(stack.min(), 1) stack.push(2) self.assertEqual(stack.min(), 1) stack.push(0) self.assertEqual(stack.min(), 0) stack.push(4) self.assertEqual(stack.min(), 0) stack.pop() self.assertEqual(stack.min(), 0) stack.pop() self.assertEqual(stack.min(), 1) stack.push(-1) self.assertEqual(stack.min(), -1) stack.pop() self.assertEqual(stack.min(), 1)