我认为排队是第一次服务的人。然后其他人加入他的后面。我在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)
根据此在线实施,项目被添加到第一个。但我的直觉说该项应该添加到列表的后面(附加)并从前面删除(删除第一项)。我想知道哪种形式是正确的,如果我不正确,那么我不能正确理解的是什么?
答案 0 :(得分:1)
无论哪种方式都有效。我同意你在左边添加右边和弹出的直觉,因此底层列表总是按照从最旧到最新的顺序。
对于它的价值,两种实现都是低效的 - 在零位置插入或弹出是O(n)操作。
有关O(1)实现,请参阅collections.deque()。
答案 1 :(得分:0)
行为或表现没有差异。
第二个示例将队列的头部视为最后一个元素,而您的代码将第一个元素视为头部。
我建议你选择对大多数人来说都很直观的实现,我建议那就是附加到列表并从前面弹出,就像你做的那样。
需要注意的一点是,在两个实现中,在空列表上调用dequeue()
将引发IndexError
异常,该异常泄漏实现的细节,即它实现为列表。如果这让你感到困扰,你可以用自己的例外来装扮它。