将队列的前半部分与后半部分交错
给定一个偶数长度的整数队列,通过将队列的前半部分与队列的后半部分交错来重新排列元素。
只有堆栈可以用作辅助空间。
如果您希望与专家一起参加现场课程,请参阅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