Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用另一个队列作为ADT从队列中删除第二项_Python_Abstract Data Type - Fatal编程技术网

Python 使用另一个队列作为ADT从队列中删除第二项

Python 使用另一个队列作为ADT从队列中删除第二项,python,abstract-data-type,Python,Abstract Data Type,remove_第二个类基本上是一个队列,除非队列长度大于2,否则每次出列都会删除第二个项。如果不是,那么您将执行与普通队列相同的操作。我只允许使用队列中的方法完成删除 我的算法: 如果队列大于两个: 假设我的队列是1234 我会先删除第一个项目,使其成为 2 3 4 然后我会删除第二项,这将是返回的值,因此它将 34 然后,我会根据需要添加回第一项 1 3 4 问题是,我不知道怎么把它加回去。Enqueue把它放在最后,所以基本上是3 4 1。我想把3-4倒过来,但我也不知道怎么做。有什么帮助吗

remove_第二个类基本上是一个队列,除非队列长度大于2,否则每次出列都会删除第二个项。如果不是,那么您将执行与普通队列相同的操作。我只允许使用队列中的方法完成删除

我的算法:

如果队列大于两个:

假设我的队列是1234

我会先删除第一个项目,使其成为

2 3 4

然后我会删除第二项,这将是返回的值,因此它将

34

然后,我会根据需要添加回第一项

1 3 4

问题是,我不知道怎么把它加回去。Enqueue把它放在最后,所以基本上是3 4 1。我想把3-4倒过来,但我也不知道怎么做。有什么帮助吗


只是想指出,我不允许调用_内容,也不允许为remove_第二类创建自己的私有变量。这应该严格使用队列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)
如何准确地跟踪要删除的值,直到可以再次添加它们,这是一个有点棘手的问题,取决于赋值规则。如果可以使用Python的普通类型(作为局部变量,而不是类的新属性),则可以将它们放在
collections
模块的列表或
deque
中。但您也可以只使用另一个
队列
实例(基类型的实例,而不是您的子类)

在您的
else
子句中尝试以下操作:

def insert(self,position,element):
    self._contents.insert(position,element)
正如我在代码中所评论的那样,
Queue.dequeue(self)
可以使用
super
内置代码更“pythonical”地编写。调用的具体细节取决于您使用的Python版本(Python3的
super
比Python2的版本更华丽)

在Python 2中,必须显式地传递
self
和当前类,因此调用将是
super(self,dequeue_2nd).dequeue()
。在Python3中,您只需使用
super().dequeue()
,它“神奇地”处理所有事情(实际上,编译器在编译时计算出类,并添加一些额外的代码,让它在运行时找到
self


对于只有基本继承的简单代码,使用
super
或按名称显式查找基类之间没有区别。但在更复杂的情况下,使用
super
非常重要。如果您使用多重继承,使用
super
调用重写的方法通常是使事情正常运行的唯一方法。

您可以在列表中的任何位置添加元素。我非常确定他们提问者根本不允许对
self做任何操作。_contents
。他们只允许使用由
队列定义的方法,而不允许访问其“私有”数据。非常感谢super()提示。
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