diff --git a/book/book_second_edition.pdf b/book/book_second_edition.pdf index 4495060..3c7084e 100644 Binary files a/book/book_second_edition.pdf and b/book/book_second_edition.pdf differ diff --git a/src/abstract_structures/queues/deque.py b/src/abstract_structures/queues/deque.py index 86573bd..a6bb95a 100644 --- a/src/abstract_structures/queues/deque.py +++ b/src/abstract_structures/queues/deque.py @@ -1,46 +1,40 @@ -#!/usr/bin/python3 -# mari von steinkirch @2013 -# steinkirch at gmail +#!/usr/bin/python +__author__ = "Mari Wahl" +__email__ = "marina.w4hl@gmail.com" +''' a class for a double ended queue (also inefficient) ''' -class Deque(object): - ''' a class for a double ended queue ''' - def __init__(self): - self.items = [] +from queue import Queue - def is_empty(self): - return self.items == [] +class Deque(Queue): - def add_front(self, item): + def enqueue_back(self, item): self.items.append(item) - def add_rear(self, item): - self.items.insert(0, item) - - def remove_front(self): - return self.items.pop() - - def remove_rear(self): + def dequeue_front(self): return self.items.pop(0) - def size(self): - return len(self.items) - - def __repr__(self): - return '{}'.format(self.items) - - -def main(): - dq = Deque() - dq.add_front(1) - dq.add_front(2) - dq.add_front(3) - dq.add_rear(40) - dq.add_rear(50) - print(dq.size()) - print(dq) if __name__ == '__main__': - main() + queue = Deque() + print("Is the queue empty? ", queue.isEmpty()) + print("Adding 0 to 10 in the queue...") + for i in range(10): + queue.enqueue(i) + print("Queue size: ", queue.size()) + print("Queue peek : ", queue.peek()) + print("Dequeue...", queue.dequeue()) + print("Queue peek: ", queue.peek()) + print("Is the queue empty? ", queue.isEmpty()) + print(queue) + + print("\nNow using the dequeue methods...") + print("Dequeue from front...", queue.dequeue_front()) + print("Queue peek: ", queue.peek()) + print(queue) + print("Queue from back...") + queue.enqueue_back(50) + print("Queue peek: ", queue.peek()) + print(queue) diff --git a/src/abstract_structures/queues/linked_queue.py b/src/abstract_structures/queues/linked_queue.py index 4aadc0a..c25dad5 100644 --- a/src/abstract_structures/queues/linked_queue.py +++ b/src/abstract_structures/queues/linked_queue.py @@ -1,61 +1,81 @@ -#!/usr/bin/python3 -# mari von steinkirch @2013 -# steinkirch at gmail +#!/usr/bin/python + +__author__ = "Mari Wahl" +__email__ = "marina.w4hl@gmail.com" + +''' Queue acts as a container for nodes (objects) that are inserted and removed according FIFO''' + class Node(object): - def __init__(self, value): + def __init__(self, value=None, pointer=None): self.value = value - self.next = None - + self.pointer = None + class LinkedQueue(object): - ''' Queue acts as a container for nodes (objects) that are inserted and removed according FIFO''' def __init__(self): - self.front = None - self.back = None + self.head = None + self.tail = None + def isEmpty(self): - return bool(self.front) + return bool(self.head) + def dequeue(self): - if self.front: - value = self.front.value - self.front = self.front.next + if self.head: + value = self.head.value + self.head = self.head.pointer return value - raise Exception('Queue is empty, cannot dequeue.') + else: + print('Queue is empty, cannot dequeue.') + def enqueue(self, value): node = Node(value) - if self.front: - self.back.next = node - self.back = node + if not self.head: + self.head = node + self.tail = node else: - self.front = node - self.back = node - return True + if self.tail: + self.tail.pointer = node + self.tail = node + def size(self): - node = self.front - num_nodes = 1 - while node.next: - num_nodes += 1 - node = node.next + node = self.head + num_nodes = 0 + while node: + num_nodes += 1 + node = node.pointer return num_nodes + def peek(self): - return self.front.value + return self.head.value + + + def _print(self): + node = self.head + while node: + print(node.value) + node = node.pointer -def main(): - queue = LinkedQueue() - queue.enqueue(1) - queue.enqueue(2) - queue.enqueue(3) - print(queue.size()) - print(queue.peek()) - print(queue.dequeue()) - print(queue.peek()) if __name__ == '__main__': - main() + queue = LinkedQueue() + print("Is the queue empty? ", queue.isEmpty()) + print("Adding 0 to 10 in the queue...") + for i in range(10): + queue.enqueue(i) + print("Is the queue empty? ", queue.isEmpty()) + queue._print() + + print("Queue size: ", queue.size()) + print("Queue peek : ", queue.peek()) + print("Dequeue...", queue.dequeue()) + print("Queue peek: ", queue.peek()) + queue._print() + diff --git a/src/abstract_structures/queues/palindrome_checker_with_deque.py b/src/abstract_structures/queues/palindrome_checker_with_deque.py index 9591099..ed8f591 100644 --- a/src/abstract_structures/queues/palindrome_checker_with_deque.py +++ b/src/abstract_structures/queues/palindrome_checker_with_deque.py @@ -1,34 +1,45 @@ -#!/usr/bin/python3 -# mari von steinkirch @2013 -# steinkirch at gmail +#!/usr/bin/python + +__author__ = "Mari Wahl" +__email__ = "marina.w4hl@gmail.com" -import sys import string -import collections +import collections +from deque import Deque + +STRIP = string.whitespace + string.punctuation + "\"'" + + +""" Using our deque class and Python's deque class """ def palindrome_checker_with_deque(str1): - d = collections.deque() - eq = True - strip = string.whitespace + string.punctuation + "\"'" - for s in str1.lower(): - if s not in strip: d.append(s) - while len(d) > 1 and eq: - first = d.pop() - last = d.popleft() - if first != last: - eq = False - return eq - -def test_palindrome_checker_with_deque(): - str1 = 'Madam Im Adam' - str2 = 'Buffy is a Slayer' - assert(palindrome_checker_with_deque(str1) == True) - assert(palindrome_checker_with_deque(str2) == False) - print('Tests passed!') + d1 = Deque() + d2 = collections.deque() + + for s in str1.lower(): + if s not in STRIP: + d2.append(s) + d1.enqueue(s) + + + eq1 = True + while d1.size() > 1 and eq1: + if d1.dequeue_front() != d1.dequeue(): + eq1 = False + + eq2 = True + while len(d2) > 1 and eq2: + if d2.pop() != d2.popleft(): + eq2 = False + + return eq1, eq2 + + if __name__ == '__main__': - test_palindrome_checker_with_deque() - - + str1 = 'Madam Im Adam' + str2 = 'Buffy is a Slayer' + print(palindrome_checker_with_deque(str1)) + print(palindrome_checker_with_deque(str2)) \ No newline at end of file diff --git a/src/abstract_structures/queues/queue.py b/src/abstract_structures/queues/queue.py index 92c9fa9..b3e0df3 100644 --- a/src/abstract_structures/queues/queue.py +++ b/src/abstract_structures/queues/queue.py @@ -1,15 +1,16 @@ -#!/usr/bin/python3 -# mari von steinkirch @2013 -# steinkirch at gmail +#!/usr/bin/python +__author__ = "Mari Wahl" +__email__ = "marina.w4hl@gmail.com" + +''' an (inefficient) class for a queue ''' class Queue(object): - ''' a class for a queue ''' def __init__(self): self.items = [] def isEmpty(self): - return self.items == [] + return bool(self.items) def enqueue(self, item): self.items.insert(0, item) @@ -19,21 +20,24 @@ class Queue(object): def size(self): return len(self.items) - + def peek(self): return self.items[-1] + def __repr__(self): + return '{}'.format(self.items) -def main(): - queue = Queue() - queue.enqueue(1) - queue.enqueue(2) - queue.enqueue(3) - print(queue.size()) - print(queue.peek()) - print(queue.dequeue()) - print(queue.peek()) if __name__ == '__main__': - main() + queue = Queue() + print("Is the queue empty? ", queue.isEmpty()) + print("Adding 0 to 10 in the queue...") + for i in range(10): + queue.enqueue(i) + print("Queue size: ", queue.size()) + print("Queue peek : ", queue.peek()) + print("Dequeue...", queue.dequeue()) + print("Queue peek: ", queue.peek()) + print("Is the queue empty? ", queue.isEmpty()) + print(queue) \ No newline at end of file diff --git a/src/abstract_structures/queues/queue_2_stacks.py b/src/abstract_structures/queues/queue_2_stacks.py deleted file mode 100644 index ee9f185..0000000 --- a/src/abstract_structures/queues/queue_2_stacks.py +++ /dev/null @@ -1,60 +0,0 @@ -class MyQueue(object): - def __init__(self): - self.enq = [] - self.deq = [] - - def enqueue(self, item): - self.enq.append(item) - - def _addStacks(self): - aux = [] - if self.enq: - while self.enq: - aux.append(self.enq.pop()) - aux.extend(self.deq) - self.deq = aux - - def dequeue(self): - self._addStacks() - if self.deq: - return self.deq.pop() - raise Exception('Cannot "deque": Queue is empty') - - def peek(self): - if self.deq: - return self.deq[-1] - elif self.enq: - return self.enq[0] - raise Exception('Cannot "peek": Queue is empty') - - def isEmpty(self): - return not (bool(self.enq) or bool(self.deq)) - - def size(self): - return len(self.enq) + len(self.deq) - - def printQueue(self): - self._addStacks() - if self.deq: - aux = str(self.deq).strip('[]') - return 'Front --> ' + aux +' <-- Back' - else: - raise Exception('Cannot "printQueue": Queue is empty') - - -def main(): - q = MyQueue() - for i in range(1, 11): - q.enqueue(i) - print(q.printQueue()) - assert(q.peek() == 1) - assert(q.isEmpty() == False) - assert(q.size() == 10) - - for i in range (1, 10): - q.dequeue() - print(q.printQueue()) - - -if __name__ == '__main__': - main() diff --git a/src/abstract_structures/queues/queue_from_two_stacks.py b/src/abstract_structures/queues/queue_from_two_stacks.py index 6af795d..c36d650 100644 --- a/src/abstract_structures/queues/queue_from_two_stacks.py +++ b/src/abstract_structures/queues/queue_from_two_stacks.py @@ -1,48 +1,75 @@ -#!/usr/bin/python3 -# mari von steinkirch @2013 -# steinkirch at gmail +#!/usr/bin/python + +__author__ = "Mari Wahl" +__email__ = "marina.w4hl@gmail.com" + + +''' an example of a queue implemented from 2 stacks ''' class Queue(object): - ''' an example of a queue implemented from 2 stacks ''' + def __init__(self): self.in_stack = [] self.out_stack = [] + + # basic methods + def _transfer(self): + while self.in_stack: + self.out_stack.append(self.in_stack.pop()) + + def enqueue(self, item): return self.in_stack.append(item) + def dequeue(self): + if not self.out_stack: + self._transfer() if self.out_stack: return self.out_stack.pop() - while self.in_stack: - self.out_stack.append(self.in_stack.pop()) - if not self.out_stack: + else: return "Queue empty!" - return self.out_stack.pop() - + + def size(self): return len(self.in_stack) + len(self.out_stack) + def peek(self): + if not self.out_stack: + self._transfer() if self.out_stack: return self.out_stack[-1] - while self.in_stack: - self.out_stack.append(self.in_stack.pop()) - return self.out_stack[-1] - - + else: + return "Queue empty!" + + def __repr__(self): + if not self.out_stack: + self._transfer() + if self.out_stack: + return '{}'.format(self.out_stack) + else: + return "Queue empty!" + + def isEmpty(self): + return not (bool(self.in_stack) or bool(self.out_stack)) + -def main(): - queue = Queue() - queue.enqueue(1) - queue.enqueue(2) - queue.enqueue(3) - print(queue.size()) - print(queue.peek()) - print(queue.dequeue()) - print(queue.peek()) if __name__ == '__main__': - main() + queue = Queue() + print("Is the queue empty? ", queue.isEmpty()) + print("Adding 0 to 10 in the queue...") + for i in range(10): + queue.enqueue(i) + print("Queue size: ", queue.size()) + print("Queue peek : ", queue.peek()) + print("Dequeue...", queue.dequeue()) + print("Queue peek: ", queue.peek()) + print("Is the queue empty? ", queue.isEmpty()) + + print("Printing the queue...") + print(queue) \ No newline at end of file diff --git a/src/abstract_structures/queues/rotating_array.py b/src/abstract_structures/queues/rotating_array.py deleted file mode 100644 index 60b3834..0000000 --- a/src/abstract_structures/queues/rotating_array.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/python3 -# mari von steinkirch @2013 -# steinkirch at gmail - - -def rotating_array(seq, N): - ''' rotate an array from right to left for a given number''' - myqueue = [] - for i in range(N): - myqueue.append(seq.pop()) - myqueue.reverse() - return myqueue + seq - - - -def test_rotating_array(module_name='this module'): - seq = [1, 2, 3, 4, 5, 6, 7] - N = 4 - assert(rotating_array(seq, N) == [4, 5, 6, 7, 1, 2, 3]) - - s = 'Tests in {name} have {con}!' - print(s.format(name=module_name, con='passed')) - - -if __name__ == '__main__': - test_rotating_array() - diff --git a/src/abstract_structures/stacks/queues_stacks/animal_shelter.py b/src/abstract_structures/stacks/animal_shelter.py similarity index 100% rename from src/abstract_structures/stacks/queues_stacks/animal_shelter.py rename to src/abstract_structures/stacks/animal_shelter.py diff --git a/src/abstract_structures/stacks/queues_stacks/setofStacks.py b/src/abstract_structures/stacks/setofStacks.py similarity index 100% rename from src/abstract_structures/stacks/queues_stacks/setofStacks.py rename to src/abstract_structures/stacks/setofStacks.py diff --git a/src/abstract_structures/stacks/queues_stacks/setofStacksList.py b/src/abstract_structures/stacks/setofStacksList.py similarity index 100% rename from src/abstract_structures/stacks/queues_stacks/setofStacksList.py rename to src/abstract_structures/stacks/setofStacksList.py diff --git a/src/abstract_structures/stacks/queues_stacks/sort_stack.py b/src/abstract_structures/stacks/sort_stack.py similarity index 100% rename from src/abstract_structures/stacks/queues_stacks/sort_stack.py rename to src/abstract_structures/stacks/sort_stack.py diff --git a/src/abstract_structures/stacks/queues_stacks/stackMinElemO1.py b/src/abstract_structures/stacks/stackMinElemO1.py similarity index 100% rename from src/abstract_structures/stacks/queues_stacks/stackMinElemO1.py rename to src/abstract_structures/stacks/stackMinElemO1.py diff --git a/src/abstract_structures/stacks/queues_stacks/stack_.py b/src/abstract_structures/stacks/stack_.py similarity index 100% rename from src/abstract_structures/stacks/queues_stacks/stack_.py rename to src/abstract_structures/stacks/stack_.py diff --git a/src/abstract_structures/stacks/queues_stacks/towers_of_hanoi.py b/src/abstract_structures/stacks/towers_of_hanoi.py similarity index 100% rename from src/abstract_structures/stacks/queues_stacks/towers_of_hanoi.py rename to src/abstract_structures/stacks/towers_of_hanoi.py