class Queue:
def __init__(self):
self._contents = []
def enqueue(self, obj):
self._contents.append(obj)
def dequeue(self):
return self._contents.pop(0)
def is_empty(self):
return self._contents == []
class remove_2nd(Queue):
def dequeue(self):
first_item = Queue.dequeue(self)
# Condition if the queue length isn't greater than two
if self.is_empty():
return first_item
else:
# Second item to return
second_item = Queue.dequeue(self)
# Add back the first item to the queue (stuck here)
删除_2nd类基本上是一个队列,除非队列的长度大于两个,又要删除每个dequeue的第二项。如果不是,那么您就可以做与普通队列相同的。我只允许使用队列中的方法完成删除_2nd。
我的算法:
如果队列大于两个:
说我的队列是1 2 3 4
我将首先删除第一个项目,以便它变成
2 3 4
然后,我将删除第二项,这将是返回的值,因此它将为
3 4
然后,我会随意添加第一个项目
1 3 4
问题是,我不知道如何添加它。顾问将其放在最后,所以基本上是3 4 1.我正在考虑逆转3 4,但我也不知道该怎么做。有帮助吗?
只想指出,我不允许致电_contents或允许为remove_2nd类创建自己的私人变量。这应该严格使用队列ADT
def insert(self,position,element):
self._contents.insert(position,element)
在删除前两个元素后,将队列恢复正确的顺序,您也需要删除所有其他元素。队列为空后,您可以添加第一个元素和所有其他元素。
您如何准确地跟踪要删除的值,直到可以再次添加它们是一个有点棘手的问题,取决于您的作业规则。如果您可以使用Python的普通类型(作为本地变量,而不是作为类的新属性(,则可以将它们放入列表或collections
模块中的deque
中。但是您也可以只使用另一个Queue
实例(基本类型的实例,而不是您的子类(。
在您的else
子句中尝试这样的事情:
second_item = Queue.dequeue(self) # note, this could be written super().dequeue()
temp = Queue()
while not self.is_empty():
temp.enqueue(Queue.dequeue(self))
self.enqueue(first_item)
while not temp.is_empty()
self.enqueue(temp.dequeue())
return second_item
正如我在代码中评论的那样,Queue.dequeue(self)
可以使用super
内置的" Python"编写。呼叫的确切细节取决于您正在使用的Python版本(Python 3的super
比Python 2的版本更典型(。
在Python 2中,您必须明确通过self
和当前类,因此呼叫为super(self, dequeue_2nd).dequeue()
。在Python 3中,您只需使用super().dequeue()
即可"神奇地"照顾一切(实际上,编译器在编译时间将班级删除,并添加一些额外的代码,让它在运行时找到self
(。
对于仅具有基本继承的简单代码,使用super
或按名称清晰查找基类之间没有区别。但是在更复杂的情况下,使用super
非常重要。如果您曾经使用多个继承,则使用super
调用覆盖方法通常是使事物保持工作的唯一方法。