Esempio n. 1
0
class Stack:
    def __init__(self):
        self.ll = LinkedList()

    def push(self, data):
        self.ll.prepend(data)

    def pop(self):
        data = self.ll.head.value
        self.ll.delete(0)
        return data
Esempio n. 2
0
class Stack:
    """
    Stack implementation using linked list which
    supports max operation.

    Implemented using two linked lists. One for elements
    themselfs and one for current max value.

    Time complexity: O(1)
    Space complexity: O(N) + O(N) for max value.
    """
    def __init__(self):
        self._main_stack = LinkedList()
        self._max_stack = LinkedList()
        self._map = {}

    def peek(self):
        """
        Takes object from the top of this stack
        without removing it from the stack.
        """
        return self._main_stack.head.value

    def pop(self):
        """
        Removes object from the top of this stack
        and returns that object.
        """
        head = self._main_stack.head.value
        self._main_stack.delete(0)
        self._max_stack.delete(0)

        return head

    def push(self, item):
        """
        Pushes an item onto the top of this stack.
        """
        if not self._max_stack.head or self._max_stack.head.value < item:
            self._max_stack.prepend(item)
        else:
            self._max_stack.prepend(self._max_stack.head.value)

        self._main_stack.prepend(item)

    def max(self):
        return self._max_stack.head.value
Esempio n. 3
0
    def test_delete(self):
        ll = LinkedList()
        ll.append(1)
        ll.append(2)
        ll.append(3)
        ll.append(4)

        ll.delete(0)
        self.assertEqual([2, 3, 4], ll.to_list())

        ll.delete(1)
        self.assertEqual([2, 4], ll.to_list())

        ll.delete(1)
        self.assertEqual([2], ll.to_list())

        ll.delete(0)
        self.assertEqual([], ll.to_list())
Esempio n. 4
0
class LinkedListTest(unittest.TestCase):
    def setUp(self):
        self.ll = LinkedList()

    def tearDown(self):
        self.ll = None
        pass

    def test_insert(self):
        self.ll.insert(5)
        self.assertEqual(self.ll.toList(), [5])
        self.assertNotEqual(self.ll.toList(), [6])

        self.ll.insert(10)
        self.assertEqual(self.ll.toList(), [5, 10])

    def test_insert_after(self):
        self.ll.insert(5)
        self.ll.insert(10)

        self.ll.insert_after(6, 7)
        self.assertEqual(self.ll.toList(), [5, 7, 10])

        self.ll.insert_after(100, 1000)
        self.assertEqual(self.ll.toList(), [5, 7, 10, 1000])

    def test_delete(self):
        self.ll.insert(5)
        self.ll.delete(5)
        self.assertEqual(self.ll.toList(), [])

        self.ll.insert(10)
        self.ll.insert(100)
        self.ll.insert(1000)
        self.ll.delete(100)
        self.assertEqual(self.ll.toList(), [10, 1000])

        self.ll.delete(1000)
        self.assertEqual(self.ll.toList(), [10])

        self.ll.delete(10)
        self.assertEqual(self.ll.toList(), [])

        self.ll.delete(100)
        self.assertEqual(self.ll.toList(), [])

    def test_delete_at(self):
        self.ll.delete_at(0)
        self.assertEqual(len(self.ll), 0)

        self.ll.insert(5)
        self.ll.delete_at(0)
        self.assertEqual(len(self.ll), 0)

        self.ll.push(10)
        self.ll.push(100)
        self.ll.push(1000)
        self.ll.delete_at(2)
        self.assertEqual(self.ll.toList(), [1000, 100])

    def test_length(self):
        self.assertEqual(len(self.ll), 0)

        self.ll.insert(5)
        self.assertEqual(len(self.ll), 1)

        self.ll.insert(5)
        self.assertEqual(len(self.ll), 2)

        self.ll.insert(10)
        self.ll.insert(100)
        self.ll.insert(1000)
        self.ll.delete(100)
        self.assertEqual(len(self.ll), 4)

    def test_contains(self):
        self.assertFalse(5 in self.ll)

        self.ll.insert(5)
        self.assertTrue(5 in self.ll)

        self.ll.push(0)
        self.assertTrue(0 in self.ll)
        self.assertFalse(3 in self.ll)

    def test_push(self):
        self.ll.push(5)
        self.assertEqual(self.ll.toList(), [5])

        self.ll.push(10)
        self.assertEqual(self.ll.toList(), [10, 5])

    def test_pop(self):
        self.ll.push(5)
        self.assertEqual(self.ll.pop(), 5)
        self.assertEqual(self.ll.toList(), [])

        self.ll.push(1)
        self.ll.push(2)
        self.ll.push(3)
        self.ll.push(4)
        self.ll.push(100)
        self.assertEqual(self.ll.pop(), 100)
        self.assertEqual(self.ll.toList(), [4, 3, 2, 1])

    def test_swap_at(self):
        self.ll.push(5)
        self.ll.push(4)
        self.ll.push(3)
        self.ll.push(2)
        self.ll.push(1)

        self.ll.swap_at(1, 3)
        self.assertEqual(self.ll.toList(), [1, 4, 3, 2, 5])

        self.ll.swap_at(0, 4)
        self.assertEqual(self.ll.toList(), [5, 4, 3, 2, 1])

        self.ll.swap_at(0, 1)
        self.assertEqual(self.ll.toList(), [4, 5, 3, 2, 1])

        self.ll.swap_at(4, 3)
        self.assertEqual(self.ll.toList(), [4, 5, 3, 1, 2])

    def test_kth(self):
        self.ll.push(5)
        self.ll.push(4)
        self.ll.push(3)
        self.ll.push(2)
        self.ll.push(1)

        self.assertEqual(self.ll.kth(0), 1)
        self.assertEqual(self.ll.kth(3), 4)

    def test_last_kth(self):
        self.ll.push(5)
        self.ll.push(4)
        self.ll.push(3)
        self.ll.push(2)
        self.ll.push(1)

        self.assertEqual(self.ll.last_kth(1), 5)
        self.assertEqual(self.ll.last_kth(3), 3)

    def test_count(self):
        self.ll.push(5)
        self.ll.push(4)
        self.ll.push(3)
        self.ll.push(5)
        self.ll.push(1)

        self.assertEqual(self.ll.count(1), 1)
        self.assertEqual(self.ll.count(5), 2)

    def test_reverse(self):
        self.ll.push(5)
        self.ll.push(4)
        self.ll.push(3)
        self.ll.push(2)
        self.ll.push(1)

        self.ll.reverse()

        self.assertEqual(self.ll.toList(), [5, 4, 3, 2, 1])
Esempio n. 5
0
class LinkedListTest(unittest.TestCase):
    def setUp(self):
        self.ll = LinkedList()

    def tearDown(self):
        self.ll = None
        pass

    def test_insert(self):
        self.ll.insert(5)
        self.assertEqual(self.ll.toList(), [5])
        self.assertNotEqual(self.ll.toList(), [6])

        self.ll.insert(10)
        self.assertEqual(self.ll.toList(), [5, 10])

    def test_insert_after(self):
        self.ll.insert(5)
        self.ll.insert(10)

        self.ll.insert_after(6, 7)
        self.assertEqual(self.ll.toList(), [5, 7, 10])

        self.ll.insert_after(100, 1000)
        self.assertEqual(self.ll.toList(), [5, 7, 10, 1000])

    def test_delete(self):
        self.ll.insert(5)
        self.ll.delete(5)
        self.assertEqual(self.ll.toList(), [])

        self.ll.insert(10)
        self.ll.insert(100)
        self.ll.insert(1000)
        self.ll.delete(100)
        self.assertEqual(self.ll.toList(), [10, 1000])

        self.ll.delete(1000)
        self.assertEqual(self.ll.toList(), [10])

        self.ll.delete(10)
        self.assertEqual(self.ll.toList(), [])

        self.ll.delete(100)
        self.assertEqual(self.ll.toList(), [])

    def test_delete_at(self):
        self.ll.delete_at(0)
        self.assertEqual(len(self.ll), 0)

        self.ll.insert(5)
        self.ll.delete_at(0)
        self.assertEqual(len(self.ll), 0)

        self.ll.push(10)
        self.ll.push(100)
        self.ll.push(1000)
        self.ll.delete_at(2)
        self.assertEqual(self.ll.toList(), [1000,100])

    def test_length(self):
        self.assertEqual(len(self.ll), 0)

        self.ll.insert(5)
        self.assertEqual(len(self.ll), 1)

        self.ll.insert(5)
        self.assertEqual(len(self.ll), 2)

        self.ll.insert(10)
        self.ll.insert(100)
        self.ll.insert(1000)
        self.ll.delete(100)
        self.assertEqual(len(self.ll), 4)

    def test_contains(self):
        self.assertFalse(5 in self.ll)

        self.ll.insert(5)
        self.assertTrue(5 in self.ll)

        self.ll.push(0)
        self.assertTrue(0 in self.ll)
        self.assertFalse(3 in self.ll)


    def test_push(self):
        self.ll.push(5)
        self.assertEqual(self.ll.toList(), [5])

        self.ll.push(10)
        self.assertEqual(self.ll.toList(), [10, 5])

    def test_pop(self):
        self.ll.push(5)
        self.assertEqual(self.ll.pop(), 5)
        self.assertEqual(self.ll.toList(), [])

        self.ll.push(1)
        self.ll.push(2)
        self.ll.push(3)
        self.ll.push(4)
        self.ll.push(100)
        self.assertEqual(self.ll.pop(), 100)
        self.assertEqual(self.ll.toList(), [4, 3, 2, 1])

    def test_swap_at(self):
        self.ll.push(5)
        self.ll.push(4)
        self.ll.push(3)
        self.ll.push(2)
        self.ll.push(1)

        self.ll.swap_at(1, 3)
        self.assertEqual(self.ll.toList(), [1, 4, 3, 2, 5])

        self.ll.swap_at(0, 4)
        self.assertEqual(self.ll.toList(), [5, 4, 3, 2, 1])

        self.ll.swap_at(0, 1)
        self.assertEqual(self.ll.toList(), [4, 5, 3, 2, 1])

        self.ll.swap_at(4, 3)
        self.assertEqual(self.ll.toList(), [4, 5, 3, 1, 2])

    def test_kth(self):
        self.ll.push(5)
        self.ll.push(4)
        self.ll.push(3)
        self.ll.push(2)
        self.ll.push(1)

        self.assertEqual(self.ll.kth(0), 1)
        self.assertEqual(self.ll.kth(3), 4)

    def test_last_kth(self):
        self.ll.push(5)
        self.ll.push(4)
        self.ll.push(3)
        self.ll.push(2)
        self.ll.push(1)

        self.assertEqual(self.ll.last_kth(1), 5)
        self.assertEqual(self.ll.last_kth(3), 3)

    def test_count(self):
        self.ll.push(5)
        self.ll.push(4)
        self.ll.push(3)
        self.ll.push(5)
        self.ll.push(1)

        self.assertEqual(self.ll.count(1), 1)
        self.assertEqual(self.ll.count(5), 2)

    def test_reverse(self):
        self.ll.push(5)
        self.ll.push(4)
        self.ll.push(3)
        self.ll.push(2)
        self.ll.push(1)

        self.ll.reverse()

        self.assertEqual(self.ll.toList(), [5, 4, 3, 2, 1])