Beispiel #1
0
class Deque:
    def __init__(self, items=None):
        """
        initializes a Deque with items if any are given.
        If items are given they are populated into Deque with
        push_front method (loading in front by default)
        """
        # initialize linked list for our deque to use
        self.list = DoublyLinkedList()

        # build are deque
        if items is not None:
            for item in items:
                self.push_front(item)

    def push_front(item):
        """
        Takes in given item and prepends it
        to the front of the deque
        """
        # use linked list prepend method
        self.list.prepend(item)

    def push_back(item):
        """
        Takes an item as parameter and appends it
        to the back of the deque
        """
        # uses linked list append method
        self.list.append(item)

    def pop_front():
        """
        Removes the item at front of deque
        and returns it
        """
        # grab item to be popped/returned
        popped_item = self.list.head

        # remove from left side of list using linkedlist delete method
        # note: this is still constant b/c popped_item is first item in linkedlist
        self.list.delete(popped_item)

        return popped_item  # returning item that was just deleted

    def pop_back():
        """
        Removes the item at the end of deque
        and returns its value
        """
        # grab item to be removed (tail of linked list)
        popped_item = self.list.tail

        # remove item from right side
        # currently O(n)
        self.list.delete(popped_item)

        return popped_item  # return value of deleted item
Beispiel #2
0
 def test_length_after_delete(self):
     dll = DoublyLinkedList(['A', 'B', 'C', 'D', 'E'])
     assert dll.length() == 5
     # Delete should decrease length
     dll.delete('A')
     assert dll.length() == 4
     dll.delete('E')
     assert dll.length() == 3
     dll.delete('C')
     assert dll.length() == 2
     dll.delete('D')
     assert dll.length() == 1
     dll.delete('B')
     assert dll.length() == 0
Beispiel #3
0
    def test_delete(self):
        dll = DoublyLinkedList()
        dll.append('L')
        dll.append('K')
        dll.append('G')

        dll.delete('L')
        assert dll.head.data == 'K'
        assert dll.tail.data == 'G'
        assert dll.length() == 2
        print(dll)

        dll.delete('K')
        assert dll.head.data == 'G'
        assert dll.tail.data == 'G'

        assert dll.length() == 1
Beispiel #4
0
class LinkedQueue(object):
    def __init__(self, iterable=None):
        """Initialize this queue and enqueue the given items, if any"""
        # Initialize a new linked list to store the items
        self.list = DoublyLinkedList()
        if iterable:
            for item in iterable:
                self.enqueue(item)

    def __repr__(self):
        """Return a string representation of this queue"""
        return 'Queue({} items, front={})'.format(self.length(), self.front())

    def is_empty(self):
        """Return True if this queue is empty, or False otherwise"""
        # TODO: Check if empty
        return self.list.size is 0

    def length(self):
        """Return the number of items in this queue"""
        # TODO: Count number of items
        return self.list.size

    def enqueue(self, item):
        """Insert the given item at the back of this queue"""
        # TODO: Insert given item
        self.list.append(item)

    def front(self):
        """Return the item at the front of this queue without removing it,
        or None if this queue is empty"""
        # TODO: Return front item, if any
        if self.is_empty():
            return None
        return self.list.head.data

    def dequeue(self):
        """Remove and return the item at the front of this queue,
        or raise ValueError if this queue is empty"""
        # TODO: Remove and return front item, if any
        if self.is_empty():
            raise ValueError('Queue is empty')
        item = self.list.head.data
        self.list.delete(item)
        return item
Beispiel #5
0
 def test_delete_with_5_items(self):
     dll = DoublyLinkedList(['A', 'B', 'C', 'D', 'E'])
     assert dll.head.data == 'A'  # First item
     assert dll.tail.data == 'E'  # Last item
     dll.delete('A')
     assert dll.head.data == 'B'  # New head
     assert dll.tail.data == 'E'  # Unchanged
     dll.delete('E')
     assert dll.head.data == 'B'  # Unchanged
     assert dll.tail.data == 'D'  # New tail
     dll.delete('C')
     assert dll.head.data == 'B'  # Unchanged
     assert dll.tail.data == 'D'  # Unchanged
     dll.delete('D')
     assert dll.head.data == 'B'  # Unchanged
     assert dll.tail.data == 'B'  # New tail
     dll.delete('B')
     assert dll.head is None  # No head
     assert dll.tail is None  # No tail
Beispiel #6
0
 def test_delete(self):
     ll = DoublyLinkedList(['A', 'B', 'C'])
     ll.delete('A')
     assert ll.head.data == 'B'  # new head
     assert ll.tail.data == 'C'  # unchanged
     assert ll.size == 2
     ll.delete('C')
     assert ll.head.data == 'B'  # unchanged
     assert ll.tail.data == 'B'  # new tail
     assert ll.size == 1
     ll.delete('B')
     assert ll.head is None  # new head
     assert ll.tail is None  # new head
     assert ll.size == 0
     with self.assertRaises(ValueError):
         ll.delete('X')  # item not in list
Beispiel #7
0
 def test_delete(self):
     ll = DoublyLinkedList()
     ll.append('A')
     ll.append('B')
     ll.append('C')
     ll.delete('A')
     assert ll.head.data == 'B'
     assert ll.tail.data == 'C'
     ll.delete('C')
     assert ll.head.data == 'B'
     assert ll.tail.data == 'B'
     ll.delete('B')
     assert ll.head is None
     assert ll.tail is None
     with self.assertRaises(ValueError):
         ll.delete('D')
 def test_delete(self):
     dll = DoublyLinkedList()
     dll.append('A')
     dll.append('B')
     dll.append('C')
     dll.delete('A')
     assert dll.head.data == 'B'
     assert dll.tail.data == 'C'
     assert dll.size == 2
     dll.delete('C')
     assert dll.head.data == 'B'
     assert dll.tail.data == 'B'
     assert dll.size == 1
     dll.delete('B')
     assert dll.head is None
     assert dll.tail is None
     assert dll.size == 0
     with self.assertRaises(ValueError):
         dll.delete('D')
 def DISABLE_test_delete(self):
     ll = DoublyLinkedList()
     ll.append('A')
     ll.append('B')
     ll.append('C')
     ll.delete('A')
     assert ll.head.data == 'B'
     assert ll.tail.data == 'C'
     assert ll.size == 2
     ll.delete('C')
     assert ll.head.data == 'B'
     assert ll.tail.data == 'B'
     assert ll.size == 1
     ll.delete('B')
     assert ll.head is None
     assert ll.tail is None
     assert ll.size == 0
     with self.assertRaises(ValueError):
         ll.delete('D')
Beispiel #10
0
 def test_size(self):
     ll = DoublyLinkedList()
     assert ll.size == 0
     # append and prepend operations increment size
     ll.append('B')
     assert ll.size == 1
     ll.prepend('A')
     assert ll.size == 2
     ll.append('C')
     assert ll.size == 3
     # delete operations decrement size
     ll.delete('B')
     assert ll.size == 2
     ll.delete('C')
     assert ll.size == 1
     ll.delete('A')
     assert ll.size == 0
Beispiel #11
0
 def test_length(self):
     ll = DoublyLinkedList()
     assert ll.length() == 0
     # append and prepend operations increase length
     ll.append('B')
     assert ll.length() == 1
     ll.prepend('A')
     assert ll.length() == 2
     ll.append('C')
     assert ll.length() == 3
     # delete operations decrease length
     ll.delete('B')
     assert ll.length() == 2
     ll.delete('C')
     assert ll.length() == 1
     ll.delete('A')
     assert ll.length() == 0
Beispiel #12
0
dll.insert(1)
assert dll.search(1) == True
dll.insert(2)
dll.insert(3)
assert dll.head.next.data == 2
assert dll.search(3) == True
assert dll.search(4) == False
print "Test 3 Passed"

# Test 4
dll = DoublyLinkedList()
assert dll.size() == 0
dll.insert(1)
dll.insert(2)
dll.insert(3)
dll.delete(2)
assert dll.tail.prev.data == 3
assert dll.search(2) == False
assert dll.search(3) == True
assert dll.size() == 2
print "Test 4 Passed"

# Test 5
dll = DoublyLinkedList()
dll.insert(1)
dll.insert(2)
dll.insert(3)
dll.insert(4)
dll.print_list_forward()

# Test 6
Beispiel #13
0
 def test_delete_with_item_not_in_list(self):
     dll = DoublyLinkedList(['A', 'B', 'C'])
     # Delete should raise error if item not found
     with self.assertRaises(ValueError):
         dll.delete('X')  # Item not found in list
Beispiel #14
0
 def test_delete_with_3_items(self):
     dll = DoublyLinkedList(['A', 'B', 'C'])
     assert dll.head.data == 'A'  # First item
     assert dll.tail.data == 'C'  # Last item
     dll.delete('A')
     assert dll.head.data == 'B'  # New head
     assert dll.tail.data == 'C'  # Unchanged
     dll.delete('C')
     assert dll.head.data == 'B'  # Unchanged
     assert dll.tail.data == 'B'  # New tail
     dll.delete('B')
     assert dll.head is None  # No head
     assert dll.tail is None  # No tail
     # Delete should raise error if item was already deleted
     with self.assertRaises(ValueError):
         dll.delete('A')  # Item no longer in list
     with self.assertRaises(ValueError):
         dll.delete('B')  # Item no longer in list
     with self.assertRaises(ValueError):
         dll.delete('C')  # Item no longer in list