2017-10-31 1 views
0

대기열에서 대기열에 넣기 및 대기열에 넣기 기능을 사용하여 대기열을 되돌리려면 어떻게해야합니까?C 역방향 대기열

대기열을 되돌리려면 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

재귀는 친구입니다. – SMA

+1

'stack '을 사용하여'queue'를 뒤집을 수 있습니다. –

답변

1

또한 하나의 큐)를 사용하여 implemet 수 :-(하나의 큐에서이 작업을 수행 할 수 있습니다 요소를 함수 스택에 저장하고 큐가 비워지면 큐에서 마지막 요소부터 첫 번째 큐까지 다시 채우기 시작합니다. 이 방법은 암시 적으로 스택을 사용하므로 명시 적으로 스택 데이터 구조를 사용하여 동일하게 수행 할 수 있습니다.

+0

당신은 여기에 스택을 사용하고 있습니다. 그래서 기본적으로 제가 제안한 것과 같은 해결책입니다 – coderredoc

+1

이'private' 키워드는 무엇입니까? –

+0

@ChristianGibbons는 오타였습니다. 고마워 :) coderredoc 질문 아래 내 의견을 참조하십시오. – SMA

1

가장 간단한 솔루션은 대기열을 반대로 스택을 사용하는 것입니다

내 코드입니다. 당신은 어떻게하는지 압니다. 큐를 비우고 (큐를 비우십시오) 그리고 나서 스택에서 팝하고 큐에 대기열에 넣으십시오. 이제 역전 된 대기열로 끝납니다.

스택을 실현하려면 2 개의 대기열이 필요하므로 2 개의 대기열이 필요합니다.

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

내부적으로는 다음과 같습니다

당신은 또한 당신이 스택 당신은 재귀를 사용하여 다음과 같이 그것을 할 수

// 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