在队列中添加数据

时间:2016-11-06 01:08:11

标签: python data-structures queue

我认为排队是第一次服务的人。然后其他人加入他的后面。我在Python中编写了以下实现来实现:

class Queue:
    def __init__(self):
        self.item = []
    def enqueue(self,value):
        self.item.append(value)
    def dequeue(self):
        return self.item.pop(0)
    def size(self):
        return len(self.item)
    def isEmpty(self):
        return self.item == []

但是当我查看在线教程时,我发现了队列的以下实现:

class Queue:
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def enqueue(self, item):
        self.items.insert(0,item)

    def dequeue(self):
        return self.items.pop()

    def size(self):
        return len(self.items)

根据此在线实施,项目被添加到第一个。但我的直觉说该项应该添加到列表的后面(附加)并从前面删除(删除第一项)。我想知道哪种形式是正确的,如果我不正确,那么我不能正确理解的是什么?

2 个答案:

答案 0 :(得分:1)

无论哪种方式都有效。我同意你在左边添加右边和弹出的直觉,因此底层列表总是按照从最旧到最新的顺序。

对于它的价值,两种实现都是低效的 - 在零位置插入或弹出是O(n)操作。

有关O(1)实现,请参阅collections.deque()

答案 1 :(得分:0)

行为或表现没有差异。

第二个示例将队列的头部视为最后一个元素,而您的代码将第一个元素视为头部。

我建议你选择对大多数人来说都很直观的实现,我建议那就是附加到列表并从前面弹出,就像你做的那样。

需要注意的一点是,在两个实现中,在空列表上调用dequeue()将引发IndexError异常,该异常泄漏实现的细节,即它实现为列表。如果这让你感到困扰,你可以用自己的例外来装扮它。