class ListStack: # TODO limit size def __init__(self, size=0): self.list_obj = LinkedList() # top of the stack is def list(self): return [link.key for link in self.list_obj.array()] def isEmpty(self): return self.list_obj.isEmpty() def push(self, key): self.list_obj.insertFirst(key, None) def pop(self): if self.isEmpty(): raise ValueError("Popping from empty stack") return self.list_obj.deleteFirst().key def peek(self): if self.isEmpty(): raise ValueError("Peeking from empty stack") return self.list_obj.first.key
def test_delete_non_existing(self): list = LinkedList() list.insertFirst(1, {"a": 1}) list.insertFirst(2, {"b": 2}) list.insertFirst(3, {"c": 3}) self.assertEqual(list.delete(2).data["b"], 2) self.assertEqual(len(list.array()), 2)
def test_delete_existing(self): list = LinkedList() list.insertFirst(1, {"a": 1}) list.insertFirst(2, {"b": 2}) list.insertFirst(3, {"c": 3}) self.assertEqual(list.delete(4), None) self.assertEqual(len(list.array()), 3)
def sort(self, array): list = LinkedList() for i in range(len(array)): if list.isEmpty(): list.insertFirst(array[i], None) else: prev, curr = None, list.first while (curr != None and curr.key < array[i]): prev, curr = curr, curr.next node = Link(array[i], None, curr) if prev == None: list.first = node else: prev.next = node return [link.key for link in list.array()]
def test_delete_first_non_empty(self): list = LinkedList() list.insertFirst(1, {"a": 1}) list.insertFirst(2, {"b": 2}) self.assertEqual(list.deleteFirst().data["b"], 2) self.assertEqual(len(list.array()), 1)