仅使用入队和出队来反转队列
Reversing a queue only using enqueue and dequeue
- 接受用户的项目并创建队列直到用户输入 -1
- 打印队列
- 反转给定队列
- 打印修改后的队列
例如输入可能是
- 1
- 2
- 3
- 4
- -1
我唯一无法工作的是仅使用入队和出队来反转队列的逻辑,显然我的尝试逻辑是完全错误的,我被卡住了,因为每个在线页面都只使用一个堆栈,但我不能使用一个堆叠.
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 空队列。然后递归展开,所有值以相反的顺序再次入队。
- 接受用户的项目并创建队列直到用户输入 -1
- 打印队列
- 反转给定队列
- 打印修改后的队列
例如输入可能是
- 1
- 2
- 3
- 4
- -1
我唯一无法工作的是仅使用入队和出队来反转队列的逻辑,显然我的尝试逻辑是完全错误的,我被卡住了,因为每个在线页面都只使用一个堆栈,但我不能使用一个堆叠.
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 空队列。然后递归展开,所有值以相反的顺序再次入队。