📜  将队列的前半部分与后半部分交错

📅  最后修改于: 2022-05-13 01:57:01             🧑  作者: Mango

将队列的前半部分与后半部分交错

给定一个偶数长度的整数队列,通过将队列的前半部分与队列的后半部分交错来重新排列元素。

只有堆栈可以用作辅助空间。

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。

例子:



Input :  1 2 3 4
Output : 1 3 2 4

Input : 11 12 13 14 15 16 17 18 19 20
Output : 11 16 12 17 13 18 14 19 15 20

以下是解决问题的步骤:
1.将队列的前半个元素压入堆栈。
2.Enqueue 返回堆栈元素。
3.将队列的前半部分元素出队并将它们入队。
4.再次将前半个元素压入堆栈。
5.交错队列和堆栈的元素。

C++
// C++ program to interleave the first half of the queue
// with the second half
#include 
using namespace std;
  
// Function to interleave the queue
void interLeaveQueue(queue& q)
{
    // To check the even number of elements
    if (q.size() % 2 != 0)
        cout << "Input even number of integers." << endl;
  
    // Initialize an empty stack of int type
    stack s;
    int halfSize = q.size() / 2;
  
    // Push first half elements into the stack
    // queue:16 17 18 19 20, stack: 15(T) 14 13 12 11
    for (int i = 0; i < halfSize; i++) {
        s.push(q.front());
        q.pop();
    }
  
    // enqueue back the stack elements
    // queue: 16 17 18 19 20 15 14 13 12 11
    while (!s.empty()) {
        q.push(s.top());
        s.pop();
    }
  
    // dequeue the first half elements of queue
    // and enqueue them back
    // queue: 15 14 13 12 11 16 17 18 19 20
    for (int i = 0; i < halfSize; i++) {
        q.push(q.front());
        q.pop();
    }
  
    // Again push the first half elements into the stack
    // queue: 16 17 18 19 20, stack: 11(T) 12 13 14 15
    for (int i = 0; i < halfSize; i++) {
        s.push(q.front());
        q.pop();
    }
  
    // interleave the elements of queue and stack
    // queue: 11 16 12 17 13 18 14 19 15 20
    while (!s.empty()) {
        q.push(s.top());
        s.pop();
        q.push(q.front());
        q.pop();
    }
}
  
// Driver program to test above function
int main()
{
    queue q;
    q.push(11);
    q.push(12);
    q.push(13);
    q.push(14);
    q.push(15);
    q.push(16);
    q.push(17);
    q.push(18);
    q.push(19);
    q.push(20);
    interLeaveQueue(q);
    int length = q.size();
    for (int i = 0; i < length; i++) {
        cout << q.front() << " ";
        q.pop();
    }
    return 0;
}


Java
// Java program to interleave
// the first half of the queue
// with the second half
import java.util.*;
  
class GFG 
{
  
// Function to interleave the queue
static void interLeaveQueue(Queueq)
{
    // To check the even number of elements
    if (q.size() % 2 != 0)
        System.out.println("Input even number of integers." );
  
    // Initialize an empty stack of int type
    Stack s = new Stack<>();
    int halfSize = q.size() / 2;
  
    // Push first half elements into the stack
    // queue:16 17 18 19 20, stack: 15(T) 14 13 12 11
    for (int i = 0; i < halfSize; i++)
    {
        s.push(q.peek());
        q.poll();
    }
  
    // enqueue back the stack elements
    // queue: 16 17 18 19 20 15 14 13 12 11
    while (!s.empty()) 
    {
        q.add(s.peek());
        s.pop();
    }
  
    // dequeue the first half elements of queue
    // and enqueue them back
    // queue: 15 14 13 12 11 16 17 18 19 20
    for (int i = 0; i < halfSize; i++) 
    {
        q.add(q.peek());
        q.poll();
    }
  
    // Again push the first half elements into the stack
    // queue: 16 17 18 19 20, stack: 11(T) 12 13 14 15
    for (int i = 0; i < halfSize; i++)
    {
        s.push(q.peek());
        q.poll();
    }
  
    // interleave the elements of queue and stack
    // queue: 11 16 12 17 13 18 14 19 15 20
    while (!s.empty())
    {
        q.add(s.peek());
        s.pop();
        q.add(q.peek());
        q.poll();
    }
}
  
// Driver code
public static void main(String[] args) 
{
    Queue q = new java.util.LinkedList<>();
    q.add(11);
    q.add(12);
    q.add(13);
    q.add(14);
    q.add(15);
    q.add(16);
    q.add(17);
    q.add(18);
    q.add(19);
    q.add(20);
    interLeaveQueue(q);
    int length = q.size();
    for (int i = 0; i < length; i++) 
    {
        System.out.print(q.peek() + " ");
        q.poll();
    }
}
}
  
// This code contributed by Rajput-Ji


Python3
# Python3 program to interleave the first 
# half of the queue with the second half 
from queue import Queue 
  
# Function to interleave the queue 
def interLeaveQueue(q):
      
    # To check the even number of elements 
    if (q.qsize() % 2 != 0): 
        print("Input even number of integers.")
  
    # Initialize an empty stack of int type 
    s = []
    halfSize = int(q.qsize() / 2) 
  
    # put first half elements into 
    # the stack queue:16 17 18 19 20, 
    # stack: 15(T) 14 13 12 11
    for i in range(halfSize):
        s.append(q.queue[0]) 
        q.get()
  
    # enqueue back the stack elements 
    # queue: 16 17 18 19 20 15 14 13 12 11 
    while len(s) != 0: 
        q.put(s[-1]) 
        s.pop()
  
    # dequeue the first half elements of 
    # queue and enqueue them back 
    # queue: 15 14 13 12 11 16 17 18 19 20
    for i in range(halfSize):
        q.put(q.queue[0]) 
        q.get()
  
    # Again put the first half elements into 
    # the stack queue: 16 17 18 19 20,
    # stack: 11(T) 12 13 14 15 
    for i in range(halfSize):
        s.append(q.queue[0]) 
        q.get()
  
    # interleave the elements of queue and stack 
    # queue: 11 16 12 17 13 18 14 19 15 20 
    while len(s) != 0: 
        q.put(s[-1]) 
        s.pop() 
        q.put(q.queue[0]) 
        q.get()
  
# Driver Code
if __name__ == '__main__':
    q = Queue()
    q.put(11) 
    q.put(12) 
    q.put(13) 
    q.put(14) 
    q.put(15) 
    q.put(16) 
    q.put(17) 
    q.put(18) 
    q.put(19) 
    q.put(20) 
    interLeaveQueue(q) 
    length = q.qsize()
    for i in range(length):
        print(q.queue[0], end = " ") 
        q.get()
  
# This code is contributed by PranchalK


C#
// C# program to interleave
// the first half of the queue
// with the second half
using System;
using System.Collections.Generic;
  
class GFG 
{
  
// Function to interleave the queue
static void interLeaveQueue(Queueq)
{
    // To check the even number of elements
    if (q.Count % 2 != 0)
        Console.WriteLine("Input even number of integers." );
  
    // Initialize an empty stack of int type
    Stack s = new Stack();
    int halfSize = q.Count / 2;
  
    // Push first half elements into the stack
    // queue:16 17 18 19 20, stack: 15(T) 14 13 12 11
    for (int i = 0; i < halfSize; i++)
    {
        s.Push(q.Peek());
        q.Dequeue();
    }
  
    // enqueue back the stack elements
    // queue: 16 17 18 19 20 15 14 13 12 11
    while (s.Count != 0) 
    {
        q.Enqueue(s.Peek());
        s.Pop();
    }
  
    // dequeue the first half elements of queue
    // and enqueue them back
    // queue: 15 14 13 12 11 16 17 18 19 20
    for (int i = 0; i < halfSize; i++) 
    {
        q.Enqueue(q.Peek());
        q.Dequeue();
    }
  
    // Again push the first half elements into the stack
    // queue: 16 17 18 19 20, stack: 11(T) 12 13 14 15
    for (int i = 0; i < halfSize; i++)
    {
        s.Push(q.Peek());
        q.Dequeue();
    }
  
    // interleave the elements of queue and stack
    // queue: 11 16 12 17 13 18 14 19 15 20
    while (s.Count != 0)
    {
        q.Enqueue(s.Peek());
        s.Pop();
        q.Enqueue(q.Peek());
        q.Dequeue();
    }
}
  
// Driver code
public static void Main(String[] args) 
{
    Queue q = new Queue();
    q.Enqueue(11);
    q.Enqueue(12);
    q.Enqueue(13);
    q.Enqueue(14);
    q.Enqueue(15);
    q.Enqueue(16);
    q.Enqueue(17);
    q.Enqueue(18);
    q.Enqueue(19);
    q.Enqueue(20);
    interLeaveQueue(q);
    int length = q.Count;
    for (int i = 0; i < length; i++) 
    {
        Console.Write(q.Peek() + " ");
        q.Dequeue();
    }
}
}
  
// This code is contributed by Princi Singh



输出:
11 16 12 17 13 18 14 19 15 20