循环阵列支持的队列调整大小/入队

时间:2016-12-02 07:40:41

标签: python queue circular-buffer

我正在尝试为循环阵列支持的队列完成最后一个方法。我坚持使用resize方法。任何帮助或指示表示赞赏。

    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()

我的enqueue方法看起来像这样,并且在其他任何地方都没有错误:

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

1 个答案:

答案 0 :(得分:0)

Queue课程需要__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__,则会收到错误,如上例所示。