卸下第二项从一个队列中,使用另一种队列作为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调用重写的方法通常是让事情合理运作的唯一方法。

+0

非常感谢,也为super()提示。 – Tinler

def insert(self,position,element): 
    self._contents.insert(position,element) 
+0

您在列表中的任何位置添加元素。 – Keval

+0

我很确定他们的提问者根本不允许对'self._contents'进行任何操作。他们只能使用'Queue'定义的方法,而不能访问其“私人”数据。 – Blckknght