def superstack(state): if state == "default": input_data = """12 push 4 pop push 3 push 5 push 2 inc 3 1 pop push 1 inc 2 2 push 4 pop pop""" instructions = input_data.strip().split("\n")[1:] stack = Stack() for instruction in instructions: instruction = instruction.strip() Manipulation.super_stack(stack, instruction) else: number_of_instructions = int(raw_input()) stack = Stack() for i in xrange(number_of_instructions): instruction = raw_input().strip() Manipulation.super_stack(stack, instruction)
class StackWithMin(Stack): """Uses a secondary stack to keep track of minimum values.""" def __init__(self): super().__init__() self.min_stack = Stack() def push(self, item): if self.is_empty(): self.min_stack.push(item) elif item <= self.min(): self.min_stack.push(item) super().push(item) def pop(self): item = super().peek() # Throws an exception if empty if self.min() == item: self.min_stack.pop() return super().pop() def min(self): if self.is_empty(): raise IndexError('Stack is empty.') else: return self.min_stack.peek()
def sort_stack_iterative(s1): """Sorts s1 interatively using a scondary stack. Ascending sort: bigger items on top. """ s2 = Stack() # Sort items in descending order in s2 while not s1.is_empty(): next_item = s1.pop() count = 0 while not s2.is_empty() and next_item > s2.peek(): s1.push(s2.pop()) count += 1 s2.push(next_item) while count > 0: s2.push(s1.pop()) count -= 1 # Move items back to s1 and reverse the order to ascedning while not s2.is_empty(): s1.push(s2.pop())
class TestTowersOfHanoi(unittest.TestCase): def setUp(self): self.s1 = Stack() self.s2 = Stack() self.s3 = Stack() def test_one(self): self.s1.push('a') towers_of_hanoi(1, self.s1, self.s2, self.s3) self.assertTrue(self.s1.is_empty()) self.assertTrue(self.s2.is_empty()) self.assertEqual(self.s3.size(), 1) self.assertEqual(self.s3.pop(), 'a') def test_three(self): self.s1.push('a') self.s1.push('b') self.s1.push('c') towers_of_hanoi(3, self.s1, self.s2, self.s3) self.assertTrue(self.s1.is_empty()) self.assertTrue(self.s2.is_empty()) self.assertEqual(self.s3.size(), 3) self.assertEqual(self.s3.pop(), 'c') self.assertEqual(self.s3.pop(), 'b') self.assertEqual(self.s3.pop(), 'a')
def setUp(self): self.s1 = Stack() self.s2 = Stack() self.s3 = Stack()
def __init__(self): super().__init__() self.min_stack = Stack()
def setUp(self): self.s = Stack()
class TestStack(unittest.TestCase): def setUp(self): self.s = Stack() def test_init(self): self.assertTrue(self.s.is_empty()) self.assertEqual(self.s.size(), 0) def test_push_and_size(self): no_of_pushes = 10 for i in range(no_of_pushes): self.s.push(i) self.assertFalse(self.s.is_empty()) self.assertEqual(self.s.size(), no_of_pushes) def test_push_then_pop(self): no_of_pushes = 10 for i in range(no_of_pushes): self.s.push(i) for i in range(no_of_pushes): self.assertEqual(self.s.pop(), no_of_pushes - i - 1) self.assertTrue(self.s.is_empty()) self.assertEqual(self.s.size(), 0) def test_push_then_peek(self): self.s.push(100) size = self.s.size() self.assertEqual(self.s.peek(), 100) self.assertEqual(self.s.size(), size) def test_pop_from_empty_stack(self): self.assertRaises(IndexError, self.s.pop) def test_peek_into_empty_stack(self): self.assertRaises(IndexError, self.s.peek)
class TestSortStack(unittest.TestCase): def setUp(self): self.s1 = Stack() self.s2 = Stack() def test_iterative_sort_one(self): self.s1.push(5) sort_stack_iterative(self.s1) self.assertEqual(self.s1.size(), 1) self.assertEqual(self.s1.pop(), 5) def test_iterative_sort_three_descending(self): self.s1.push(3) self.s1.push(2) self.s1.push(1) sort_stack_iterative(self.s1) self.assertEqual(self.s1.size(), 3) self.assertEqual(self.s1.pop(), 3) self.assertEqual(self.s1.pop(), 2) self.assertEqual(self.s1.pop(), 1) def test_iterative_sort_three_mixed(self): self.s1.push(3) self.s1.push(1) self.s1.push(2) sort_stack_iterative(self.s1) self.assertEqual(self.s1.size(), 3) self.assertEqual(self.s1.pop(), 3) self.assertEqual(self.s1.pop(), 2) self.assertEqual(self.s1.pop(), 1) def test_recursive_sort_one(self): self.s1.push(5) sort_stack_recursive(1, self.s1, self.s2) self.assertEqual(self.s1.size(), 1) self.assertEqual(self.s1.pop(), 5) self.assertEqual(self.s2.size(), 0) def test_recursive_sort_three_descending(self): self.s1.push(3) self.s1.push(2) self.s1.push(1) sort_stack_recursive(3, self.s1, self.s2) self.assertEqual(self.s1.size(), 3) self.assertEqual(self.s1.pop(), 3) self.assertEqual(self.s1.pop(), 2) self.assertEqual(self.s1.pop(), 1) self.assertEqual(self.s2.size(), 0) def test_recursive_sort_three_mixed(self): self.s1.push(3) self.s1.push(1) self.s1.push(2) sort_stack_recursive(3, self.s1, self.s2) self.assertEqual(self.s1.size(), 3) self.assertEqual(self.s1.pop(), 3) self.assertEqual(self.s1.pop(), 2) self.assertEqual(self.s1.pop(), 1) self.assertEqual(self.s2.size(), 0)