仅使用入队和出队来反转队列

Reversing a queue only using enqueue and dequeue

例如输入可能是

我唯一无法工作的是仅使用入队和出队来反转队列的逻辑,显然我的尝试逻辑是完全错误的,我被卡住了,因为每个在线页面都只使用一个堆栈,但我不能使用一个堆叠.

from Queue import Queue

def reverseQueueFirstKElements(k, queue):
    for i in range(k):
        if queue is None:
            return
        temp =  queue.dequeue()
        queue.enqueue(temp)
        node = queue.list.head
        print(node.data)
        

if __name__ == '__main__':
    queue = Queue()
    nums = 0
    k = 0
    while nums != -1:
        nums = int(input())
        if nums == -1:
            break
        else:   
            queue.enqueue(nums)
        k += 1
    node = queue.list.head
    while node is not None:
        print(node.data)
        node = node.next
    reverseQueueFirstKElements(k, queue)

这里是队列文件

from Node import Node
from LinkedList import LinkedList

class Queue:
    def __init__(self):
        self.list = LinkedList()
        
    def enqueue(self, new_item):
        # Create a new node to hold the item
        new_node = Node(new_item)
        
        # Insert as list tail (end of queue)
        self.list.append(new_node)
    
    def dequeue(self):
        # Copy data from list's head node (queue's front node)
        dequeued_item = self.list.head.data
        
        # Remove list head
        self.list.remove_after(None)
        
        # Return the dequeued item
        return dequeued_item

我不知道这是否是您要查找的内容,但是 deque 模块有一个 .reverse() 功能,可以自动反转整个列表的顺序。 可以在此处找到更多信息:https://docs.python.org/3/library/collections.html#collections.deque.reverse

您不能像您尝试的那样在循环中执行此操作,因为这不会改变顺序...它只会轮换队列以(几乎)与您开始时相同。

执行此操作的方法是使用堆栈:将队列刷新到堆栈,然后将堆栈刷新回队列。

现在,你会说你不应该使用堆栈,但你可以为此目的使用 call 堆栈,并使用递归:

def reverse(queue):
    try:
        data = queue.dequeue()
    except AttributeError:
        return queue
    reverse(queue)
    queue.enqueue(data)

请注意,我取消了 k,因为无论如何您都想反转整个队列。

此算法的基本情况是队列为空时。在那种情况下,调用您的 dequeue 实现将在访问 head.data 时触发异常,因为那时 head 成员将是 None。此函数捕获该错误,并且 returns 空队列。然后递归展开,所有值以相反的顺序再次入队。