示例#1
0
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 _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 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 []
示例#4
0
class TestQueue(unittest.TestCase):
    def setUp(self):
        self.queue = Queue()

    def queue_add_small(self):
        self.queue.add(1)
        self.queue.add(2)
        self.queue.add(3)

    def sanity_check(self, input_data):
        self.assertEqual(self.queue.data, input_data)

    def test_init(self):
        self.sanity_check([])

    def test_add(self):
        self.queue.add("hi")
        self.sanity_check(["hi"])
        self.queue.add("hello")
        self.sanity_check(["hi", "hello"])

    def test_peek(self):
        self.queue_add_small()
        self.assertEqual(self.queue.peek(), 1)

    def test_remove(self):
        self.queue_add_small()
        output = self.queue.remove()
        self.assertEqual(output, 1)
        self.sanity_check([2, 3])
        output = self.queue.remove()
        self.assertEqual(output, 2)
        self.sanity_check([3])
        output = self.queue.remove()
        self.assertEqual(output, 3)
        self.sanity_check([])

    def test_peek_error(self):
        self.assertRaises(Exception, lambda: self.queue.peek())

    def test_pop_error(self):
        self.assertRaises(Exception, lambda: self.queue.remove())