队列前端和后端引用是如何工作的?

2024-06-17 13:28:59 发布

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

在我的CS1课程中,我们目前正在学习python中的单链接列表、堆栈和队列。我们正在做一个例子,向队列添加一个新元素,并相应地将队列的前后引用设置为。我不明白为什么我会得到这个特定的输出。当执行queue.back.next = new_part时,它只应将queue.back.next更改为the new_part节点,但它将queue.front.nextqueue.back.next更改为等于new_part。为什么会这样

我尝试过调试,并逐步完成了每一行。当我到达执行中的第7行(提到的那行)时,它只是将queue.front.nextqueue.back.next设置为new_part

排队功能:

def enqueue(queue, element):
    new_part = Node(element, None)
    if is_empty_queue(queue):
        queue.front = new_part
    else:
        queue.back.next = new_part
    queue.back = new_part

测试功能:

def test_enqueue():
    new_queue = make_queue()
    enqueue(new_queue, 'arms')
    print(new_queue)
    enqueue(new_queue, 'legs')
    print(new_queue)
    enqueue(new_queue, 'head')
    print(new_queue)

输出

Queue(size=0, front=Node(value='arms', next=None), back=Node(value='arms', next=None))
Queue(size=0, front=Node(value='arms', next=Node(value='legs', next=None)), back=Node(value='legs', next=None))
Queue(size=0, front=Node(value='arms', next=Node(value='legs', next=Node(value='head', next=None))), back=Node(value='head', next=None))

Process finished with exit code 0

Tags: nonenodenew队列queuevaluebackhead
1条回答
网友
1楼 · 发布于 2024-06-17 13:28:59

输出是您想要的(除了需要添加逻辑以正确跟踪队列大小):将三个元素排队后,'arms'一个在队列的前面,'head'一个在后面。因此,我假设问题只是理解代码,而不是修复代码

queue.back.next = new_part is executed, it should only change queue.back.next to the new_part node, yet it changes both queue.front.next and queue.back.next to equal new_part. Why is this happening?

第一个元素排队时,queue.front = new_partqueue.back = new_part都被执行,使它们都引用新创建的new_part = Node(element, None)。因此,在将第二个元素排队之前,queue.frontqueue.back是同一个对象

这其实是正确的行为,;从逻辑上讲,对于包含一个元素的队列,前面和后面实际上是同一项。因此,当添加第二个元素时,它应该是队列前面的next,也应该是队列后面的next。因此,我们创建该链接,然后重新调整queue.back以引用新元素,因为它现在位于队列的后面

正如您在对第三个元素排队时所看到的,queue.frontqueue.back在开始时不再相同,因此queue.front不会受到影响

相关问题 更多 >