从队列中删除第二项,使用另一个队列作为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)

删除_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调用覆盖方法通常是使事物保持工作的唯一方法。

相关内容

最新更新