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)
Exemple #2
0
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()
Exemple #3
0
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())
Exemple #4
0
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')
Exemple #5
0
 def setUp(self):
     self.s1 = Stack()
     self.s2 = Stack()
     self.s3 = Stack()
Exemple #6
0
 def __init__(self):
     super().__init__()
     self.min_stack = Stack()
Exemple #7
0
 def setUp(self):
     self.s = Stack()
Exemple #8
0
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)
Exemple #9
0
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)