【问题标题】:C Reverse QueueC 反向队列
【发布时间】:2017-10-31 15:50:09
【问题描述】:

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

【问题讨论】:

  • 递归是你的朋友。
  • 您可以使用stack 来反转queue

标签: c data-structures queue


【解决方案1】:

你可以使用递归来做到这一点:

void reverse(Queue *queue) {
    int element;
    if (isEmptyQueue(queue)) {
      return;
    }
    element = dequeue(queue);
    reverse(queue);
    enqueue(queue, element);
}

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

【讨论】:

  • 您在这里通过使用recurssion来使用堆栈。所以它与我描述的解决方案基本相同
  • 这是什么private关键字?
  • @ChristianGibbons 是一个错字。谢谢 :) coderredoc 请在问题下方查看我的评论。
【解决方案2】:

最简单的解决方案是使用堆栈来反转队列。你知道该怎么做。只需使队列出队(清空队列),然后从堆栈中弹出并入队。你现在得到了反向队列。

要实现一个栈,你需要 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

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多