C反向队列

时间:2017-10-31 15:50:09

标签: c data-structures queue

如何使用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);
}

2 个答案:

答案 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);
}

在内部它会将元素存储在函数堆栈中,一旦你的队列被清空,它将从最后一个元素开始再次填充队列直到第一个元素。此方法隐式使用堆栈,您可以使用堆栈数据结构明确地执行相同操作。