如何使用dequeue和enqueue函数来反转队列?
是否必须使用2队列来反转队列?
这是我的代码:
void reverse(Queue *q)
{
Queue *new_q = (Queue*) malloc(sizeof(Queue));
new_q->ll.head = NULL;
new_q->ll.size = 0;
ListNode *pLast;
while(!isEmptyQueue(q)){
pLast = q->ll.tail;
while(q->ll.head != pLast){
dequeue(q);
enqueue(q, q->ll.head->item);
}
dequeue(q);
enqueue(new_q, q->ll.head->item);
}
while(!isEmptyQueue(new_q))
{
dequeue(new_q);
enqueue(q, q->ll.head->item);
}
free(new_q);
}
答案 0 :(得分:1)
最简单的解决方案是使用堆栈来反转队列。你知道怎么做。只需将队列出列队列(清空队列),然后从堆栈弹出并排入队列。你现在最终得到了逆转队列。
要实现堆栈,您需要2个队列,这就是需要2个队列的原因。
您也可以在一个队列中执行此操作:-(您也可以使用一个队列实现堆栈)
// E is the element to be pushed and s is stack
push(s, E)
1) Let size of queue be sz.
1) Enqueue E to queue
2) One by one Dequeue sz items from queue and enqueue them.
// Removes an item from stack
pop(s)
1) Dequeue an item from queue
答案 1 :(得分:1)
您可以使用递归执行以下操作:
void reverse(Queue *queue) {
int element;
if (isEmptyQueue(queue)) {
return;
}
element = dequeue(queue);
reverse(queue);
enqueue(queue, element);
}
在内部它会将元素存储在函数堆栈中,一旦你的队列被清空,它将从最后一个元素开始再次填充队列直到第一个元素。此方法隐式使用堆栈,您可以使用堆栈数据结构明确地执行相同操作。