卸下第二项从一个队列中,使用另一种队列作为ADT
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)
的remove_2nd类基本上是一个队列,除非队列的长度大于二,则删除第二项目出队的每个。如果不是,那么你和普通队列一样。我只能使用队列中的方法来完成remove_2nd。卸下第二项从一个队列中,使用另一种队列作为ADT
我的算法:
如果队列是大于二:
比方说我的队列1 2 3 4
,使其成为
2我会先取下第一项3 4
然后我会删除第二个项目,那将是返回的值,那么它将是
然后,我会加回第一项通缉
的问题是,我不知道如何将它添加回来。 Enqueue把它放在最后,所以基本上它会是3 4 1.我正在考虑颠倒3 4,但我也不知道该怎么做。任何帮助?
只是想指出,我不允许在_contents上调用或者允许为remove_2nd类创建我自己的私有变量。这应该严格使用队列来完成
要在取消前两个元素后按正确的顺序返回队列,还需要删除所有其他元素。一旦队列为空,您可以逐个添加第一个元素和所有其他元素。
您如何跟踪要删除的值直到您可以再次添加它们是一个有点棘手的问题,这取决于您的任务规则。如果您可以使用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
写更多的“pythonically”。调用的确切细节取决于您使用的是哪个版本的Python(Python 3的super
比Python 2的版本更有趣)。
在Python 2中,您必须明确地传递self
和您当前的类,因此调用将是super(self, dequeue_2nd).dequeue()
。在Python 3中,您只需使用super().dequeue()
,它“神奇地”处理所有事情(实际上,编译器会在编译时计算出该类,并添加一些额外的代码以使其在运行时找到self
)。
对于只有基本继承的简单代码,使用super
或显式查找基类的名称没有区别。但在更复杂的情况下,使用super
非常重要。如果您曾经使用过多重继承,那么使用super
调用重写的方法通常是让事情合理运作的唯一方法。
非常感谢,也为super()提示。 – Tinler