循环数组支持队列 resize/enqueue

circular array backed queue resize/enqueue

我正在尝试完成循环数组支持队列的最后一个方法。我坚持调整大小的方法。感谢任何帮助或指点。

    def resize(self, newsize):
    assert(len(self.data) < newsize)
    new = Queue(newsize)
    for x in range(len(self.data)):
        new[x] == self.data[x]
    self.data = new

我收到的错误是:

    <ipython-input-31-d458e1ceda34> in <module>()
     19 
     20 for i in range(9, 14):
---> 21     q.enqueue(i)
     22 
     23 for i in range(4, 14):

    <ipython-input-28-0e6c7038d634> in enqueue(self, val)
      9 
     10     def enqueue(self, val):
---> 11         if self.head == (self.tail + 1) % len(self.data):
     12             raise RuntimeError
     13         elif self.head == -1 and self.tail == -1:

TypeError: object of type 'Queue' has no len()

我的入队方法如下所示,并且在其他任何地方都没有出现错误:

def enqueue(self, val):
    if self.head == (self.tail + 1) % len(self.data):
        raise RuntimeError
    elif self.head == -1 and self.tail == -1:
        self.head = 0
        self.tail = 0
        self.data[self.tail] = val
    else: 
        self.tail = (self.tail + 1) % len(self.data)
        self.data[self.tail] = val

Queue class 需要 __len__ 方法:

>>> class Queue:
...     pass
... 
>>> len(Queue())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'Queue' has no len()
>>> class Queue:
...     def __len__(self):
...         return 0
... 
>>> len(Queue())
0

当调用内置方法 len 时,它将在内部调用传递对象的 __len__。如果对象没有定义 __len__,您将收到如上例所示的错误。