循环队列Python

2024-09-22 22:30:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Python中创建一个循环队列,以便在到达数组中的最后一个元素时指向头部。我正在研究排队方法,我遇到了一些问题。我正在尝试使用一个大小为4的数组,并且能够将值排队到第4个点,但是当它执行elif语句时,我收到这个错误。

TypeError:不支持+的操作数类型:“Node”和“int”

有什么想法吗?

class Node(object):
    def __init__(self, item = None):
        self.item = [None] * 4
        self.next = None
        self.previous = None

class CircularQueue(object):
    def __init__(self):
        self.length = 0
        self.head = None
        self.tail = None
    def enqueue(self, x):
        newNode = Node(x)
        newNode.next = None
        if self.head == None:
            self.head = newNode
            self.tail = newNode
        elif self.length < 4:
            self.tail.next = newNode
            newNode.previous = self.tail
            self.tail = newNode
        else:
            self.tail = (self.tail + 1) % 4
        self.length += 1
    def dequeue(self):
        if self.count == 0:
            print ("The Queue is empty!")
        self.count -= 1
        return self.item.pop()
    def size(self):
        return self.length

Tags: selfnonenodeobjectdef数组itemlength
3条回答

我将试着给您指出正确的方向,因为看起来您正在尝试学习如何实现循环队列,并且可能同时学习编程。错误消息试图告诉您变量self.tail是一个对象,不能将其添加到数字(整数)中。

代码行:

self.tail = (self.tail + 1) % 4

是导致错误的问题。但是,在尝试修复这一行之前,需要理解一些核心概念。例如,不必在节点对象中创建数组。Self.item可以设置为任何值。这似乎混淆了循环队列的用途。例如代替

self.item = [None] * 4

你可以用

self.item = item

然后,在创建节点对象时,可以使用以下内容:

mycircularqueue = CircularQueue()
mycircularqueue.enqueue('cat')
mycircularqueue.enqueue('dog')
mycircularqueue.enqueue('mouse')

向队列中添加三项。

如果不需要自己实现,可以使用标准库deque

from collections import deque

circular_queue = deque([1,2], maxlen=4)
circular_queue.append(3)
circular_queue.extend([4])

# at this point you have [1,2,3,4]
print(circular_queue.pop())  # [1,2,3] --> 4

# key step. effectively rotate the pointer
circular_queue.rotate(-1)  # negative to the left. positive to the right

# at this point you have [2,3,1]
print(circular_queue.pop())  # [2,3] --> 1

你的问题是:

self.tail + 1

但在之前,您将tail初始化为一个节点:

self.tail = newNode

这就是错误。

相关问题 更多 >