一种只使用两个临时队列而不是更多的方法来反转队列?

时间:2009-05-04 00:54:33

标签: algorithm data-structures

有没有办法只使用两个临时队列(而没有其他变量,如计数器)来反转队列中的顺序?只有标准队列操作可用:ENQUEUE(e),DEQUEUE(),EMPTY()?

欢迎使用任何语言或伪代码的解决方案。

8 个答案:

答案 0 :(得分:4)

你可以:

答案 1 :(得分:2)

// REVERSE OF QUEUE USING 1 QUEUE N OTHER DEQUEUE
void reverse() {
  int q1[20],q2[20],f1,r1,f2,r2;
  while(f1!=r1) {
     q1[r2]=q1[f1];
     r2=r2+1;
     f1=f1+1;
  }
  //whole elements of temporary queue is transfered to dequeue.
  while(r2!=f2) {
     q1[r1]=q2[r2];
     r2=r2-1;
     r1=r1+1;
  }
}

答案 2 :(得分:2)

我意识到这个线程已经死了,但我相信我找到了一个满足所有要求的非常好的解决方案。

您只需要一个临时队列。您所做的只要原始队列不为空,您可以通过设置指向最后一个节点的指针并将节点取消并重新接入原始队列来将队列中的最后一个节点移动到前面。 然后从原始队列中进行deqeueue并排入临时队列。 之后,您只需将temp复制回原始队列。

这是我的C,ADT风格的解决方案: (至少我不用担心为你做功课)

QUEUE * reverseQueue(QUEUE *队列) {

QUEUE *temp;
QUEUE_NODE *pLast;
void *dataPtr;

//Check for empty queue
if(emptyQueue(queue))
    return NULL;

//Check for single node queue
if(queueCount(queue) == 1)
    return queue;

temp = createQueue();   
while(!emptyQueue(queue))
{   
    pLast = queue->rear;
    //Move last node to front of queue
    while(queue->front != pLast)
    {
        dequeue(queue, &dataPtr);
        enqueue(queue, dataPtr);
    }
    //Place last node in temp queue
    dequeue(queue, &dataPtr);
    enqueue(temp, dataPtr);

}
//Copy temp queue back to original queue
while(!emptyQueue(temp))
{
    dequeue(temp, &dataPtr);
    enqueue(queue, dataPtr);
}
destroyQueue(temp);
return queue;

}

答案 3 :(得分:0)

所以这样做的方法是将原始队列中的所有内容(除了最后一项)出列到临时队列,将最后一项放在最终队列中。然后重复,每次将除最后一个项目之外的每个项目从一个临时队列复制到另一个临时队列,最后一个项目复制到最终队列。嗯....有更好的方法吗?

答案 4 :(得分:0)

while(!queue.EMTPY())
{
    while(!finalQueue.EMPTY())
    {
        tempQueue.ENQUEUE(finalQueue.DEQUEUE());
    }
    finalQueue.ENQUEUE(queue.DEQUEUE());
    while(!tempQueue.EMPTY())
    {
        finalQueue.ENQUEUE(tempQueue.DEQUEUE());
    }
}

我认为这应该有效。如果可以将temp和final队列与原始队列中的每个队列交换,那么有一种更有效的方法。

答案 5 :(得分:0)

答案是肯定的。我很想把它留在那里,因为这听起来像是一个家庭作业问题,但我认为这是一个有趣的问题。

如果只能使用这三个操作,则必须使用两个临时队列。

基本上你必须从主队列中出队并将项目放入临时队列A.将所有项目从临时队列B(最初为空)出列到A中。然后执行同样的操作,只反转从A到B的顺序。您始终会排入空的临时队列,然后将其他临时队列中的所有项目放入其中。当要反转的队列为空时,您可以从非空的临时队列中出队并排入主队列,然后您应该反转。

我会给伪代码,但是再次,我担心我正在为你做功课。

答案 6 :(得分:0)

这类似于Tower of Hanoi难题:)

这是C#中的解决方案:

static Queue<T> ReverseQueue<T>(Queue<T> initialQueue)
{
    Queue<T> finalQueue = new Queue<T>();
    Queue<T> intermediateQueue = new Queue<T>();

    while (initialQueue.Count > 0)
    {
        // Move all items from the initial queue to the intermediate queue, 
        // except the last, which is placed on the final queue.
        int c = initialQueue.Count - 1;
        for (int i = 0; i < c; i++)
        {
            intermediateQueue.Enqueue(initialQueue.Dequeue());
        }
        finalQueue.Enqueue(initialQueue.Dequeue());

        // Swap the 'initialQueue' and 'intermediateQueue' references.
        Queue<T> tempQueue = initialQueue;
        initialQueue = intermediateQueue;
        intermediateQueue = tempQueue;
    }

    return finalQueue;
}

答案 7 :(得分:0)

要从作为队列内容的队列中反转字符串,我们还需要两个队列 在第一个队列中将除最后一个元素之外的所有元素出列,并将它们排入第二个队列。 现在将第3个队列中的最后一个元素排入队列。这个队列从第2个队列到第1个队列,并将第3个队列中的最后一个元素排入队列。 重复这个,直到两个堆叠为空。