class AnimalShelter: def __init__(self): self.dog_queue = Queue() self.cat_queue = Queue() def enqueue(self, animal): animal.time_stamp = time.time() if animal.type == "dog": self.dog_queue.add(animal) if animal.type == "cat": self.cat_queue.add(animal) def dequeue_any(self): if self.dog_queue.is_empty(): return self.cat_queue.remove() if self.cat_queue.is_empty(): return self.dog_queue.remove() if self.dog_queue.peek().time_stamp < self.cat_queue.peek().time_stamp: return self.dog_queue.remove() else: return self.cat_queue.remove() def dequeue_dog(self): return self.dog_queue.remove() def dequeue_cat(self): return self.cat_queue.remove()
def bi_directional_search(self, src, dst): self._add_inverted_children() self.reset_node_paths() queue_src = Queue() queue_dst = Queue() src_visited = set() dst_visited = set() queue_src.add(src) src_visited.add(src) queue_dst.add(dst) dst_visited.add(dst) collided = False while not queue_src.is_empty() or not queue_dst.is_empty(): if len(src_visited.intersection(dst_visited)) > 0: collided = True break if not queue_src.is_empty(): src_output = queue_src.remove() for child in src_output.children: if child not in src_visited: child.forward_pre = src_output queue_src.add(child) src_visited.add(child) if len(src_visited.intersection(dst_visited)) > 0: collided = True break if not queue_dst.is_empty(): dst_output = queue_dst.remove() if dst_output in self.inverted: for child in self.inverted[dst_output]: if child not in dst_visited: child.backward_pre = dst_output queue_dst.add(child) dst_visited.add(child) if collided: intersect = src_visited.intersection(dst_visited).pop() forward = [] ref = intersect while ref is not None: forward = [ref.data] + forward ref = ref.forward_pre ref = intersect backward = [] while ref is not None: backward += [ref.data] ref = ref.backward_pre return forward[:-1] + backward else: return []
def _bfs(self, start_node): result = [] queue = Queue() queue.add(start_node) self.visited.add(start_node) while not queue.is_empty(): output_node = queue.remove() for child in output_node.children: if child not in self.visited: queue.add(child) self.visited.add(child) result += [output_node.data] return result
def test_dequeue(self): queue = Queue() queue.enqueue('thingi') self.assertEqual(queue.dequeue(), 'thingi') self.assertTrue(queue.is_empty())
def test_is_empty(self): queue = Queue() self.assertTrue(queue.is_empty()) queue.enqueue('an item') self.assertFalse(queue.is_empty())
def test_is_empty(self): schwerns_queue = Queue() self.assertTrue(schwerns_queue.is_empty()) schwerns_queue.enqueue('dicks') self.assertFalse(schwerns_queue.is_empty())