给定一个队列,任务是使用递归对它排序而不使用任何循环。我们只能使用以下队列功能:
empty(q): Tests whether the queue is empty or not.
push(q): Adds a new element to the queue.
pop(q): Removes front element from the queue.
size(q): Returns the number of elements in a queue.
front(q): Returns the value of the front element without removing it.
例子:
Input: queue = {10, 7, 16, 9, 20, 5}
Output: 5 7 9 10 16 20
Input: queue = {0, -2, -1, 2, 3, 1}
Output: -2 -1 0 1 2 3
方法:解决方案的想法是将所有值保存在函数调用堆栈中,直到队列变空。当队列为空时,按排序顺序插入所有保留的项目。在这里,排序顺序很重要。
如何管理排序的订单?
每当您从函数调用堆栈中获得该项目时,都应首先计算队列的大小,然后将其与队列的元素进行比较。在这里,出现两种情况:
- 如果项(由函数调用堆栈返回)更大,则队列的前元素然后将前元素出队,并通过减小大小将该元素入队到同一队列中。
- 如果项小于队列中的最前面的元素,则将元素放入队列中,然后将剩余的元素从队列中出队,并通过减小大小来入队,除非大小为零,否则重复情况1和2。请注意一件事,如果大小变为零并且您的元素保持更大,则队列中的所有元素都将您的元素推入队列。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to push element in last by
// popping from front until size becomes 0
void FrontToLast(queue& q, int qsize)
{
// Base condition
if (qsize <= 0)
return;
// pop front element and push
// this last in a queue
q.push(q.front());
q.pop();
// Recursive call for pushing element
FrontToLast(q, qsize - 1);
}
// Function to push an element in the queue
// while maintaining the sorted order
void pushInQueue(queue& q, int temp, int qsize)
{
// Base condition
if (q.empty() || qsize == 0) {
q.push(temp);
return;
}
// If current element is less than
// the element at the front
else if (temp <= q.front()) {
// Call stack with front of queue
q.push(temp);
// Recursive call for inserting a front
// element of the queue to the last
FrontToLast(q, qsize);
}
else {
// Push front element into
// last in a queue
q.push(q.front());
q.pop();
// Recursive call for pushing
// element in a queue
pushInQueue(q, temp, qsize - 1);
}
}
// Function to sort the given
// queue using recursion
void sortQueue(queue& q)
{
// Return if queue is empty
if (q.empty())
return;
// Get the front element which will
// be stored in this variable
// throughout the recursion stack
int temp = q.front();
// Remove the front element
q.pop();
// Recursive call
sortQueue(q);
// Push the current element into the queue
// according to the sorting order
pushInQueue(q, temp, q.size());
}
// Driver code
int main()
{
// Push elements to the queue
queue qu;
qu.push(10);
qu.push(7);
qu.push(16);
qu.push(9);
qu.push(20);
qu.push(5);
// Sort the queue
sortQueue(qu);
// Print the elements of the
// queue after sorting
while (!qu.empty()) {
cout << qu.front() << " ";
qu.pop();
}
}
Java
// Java implementation of the approach
import java.util.*;
class GFG
{
// Function to push element in last by
// popping from front until size becomes 0
static void FrontToLast(Queue q,
int qsize)
{
// Base condition
if (qsize <= 0)
return;
// pop front element and push
// this last in a queue
q.add(q.peek());
q.remove();
// Recursive call for pushing element
FrontToLast(q, qsize - 1);
}
// Function to push an element in the queue
// while maintaining the sorted order
static void pushInQueue(Queue q,
int temp, int qsize)
{
// Base condition
if (q.isEmpty() || qsize == 0)
{
q.add(temp);
return;
}
// If current element is less than
// the element at the front
else if (temp <= q.peek())
{
// Call stack with front of queue
q.add(temp);
// Recursive call for inserting a front
// element of the queue to the last
FrontToLast(q, qsize);
}
else
{
// Push front element into
// last in a queue
q.add(q.peek());
q.remove();
// Recursive call for pushing
// element in a queue
pushInQueue(q, temp, qsize - 1);
}
}
// Function to sort the given
// queue using recursion
static void sortQueue(Queue q)
{
// Return if queue is empty
if (q.isEmpty())
return;
// Get the front element which will
// be stored in this variable
// throughout the recursion stack
int temp = q.peek();
// Remove the front element
q.remove();
// Recursive call
sortQueue(q);
// Push the current element into the queue
// according to the sorting order
pushInQueue(q, temp, q.size());
}
// Driver code
public static void main(String[] args)
{
// Push elements to the queue
Queue qu = new LinkedList<>();
qu.add(10);
qu.add(7);
qu.add(16);
qu.add(9);
qu.add(20);
qu.add(5);
// Sort the queue
sortQueue(qu);
// Print the elements of the
// queue after sorting
while (!qu.isEmpty())
{
System.out.print(qu.peek() + " ");
qu.remove();
}
}
}
// This code is contributed by PrinciRaj1992
Python3
# defining a class Queue
class Queue:
def __init__(self):
self.queue = []
def put(self, item):
self.queue.append(item)
def get(self):
if len(self.queue) < 1:
return None
return self.queue.pop(0)
def front(self):
return self.queue[0]
def size(self):
return len(self.queue)
def empty(self):
return not(len(self.queue))
# Function to push element in last by
# popping from front until size becomes 0
def FrontToLast(q, qsize) :
# Base condition
if qsize <= 0:
return
# pop front element and push
# this last in a queue
q.put(q.get())
# Recursive call for pushing element
FrontToLast(q, qsize - 1)
# Function to push an element in the queue
# while maintaining the sorted order
def pushInQueue(q, temp, qsize) :
# Base condition
if q.empty() or qsize == 0:
q.put(temp)
return
# If current element is less than
# the element at the front
elif temp <= q.front() :
# Call stack with front of queue
q.put(temp)
# Recursive call for inserting a front
# element of the queue to the last
FrontToLast(q, qsize)
else :
# Push front element into
# last in a queue
q.put(q.get())
# Recursive call for pushing
# element in a queue
pushInQueue(q, temp, qsize - 1)
# Function to sort the given
# queue using recursion
def sortQueue(q):
# Return if queue is empty
if q.empty():
return
# Get the front element which will
# be stored in this variable
# throughout the recursion stack
temp = q.get()
# Recursive call
sortQueue(q)
# Push the current element into the queue
# according to the sorting order
pushInQueue(q, temp, q.size())
# Driver code
qu = Queue()
# Data is inserted into Queue
# using put() Data is inserted
# at the end
qu.put(10)
qu.put(7)
qu.put(16)
qu.put(9)
qu.put(20)
qu.put(5)
# Sort the queue
sortQueue(qu)
# Print the elements of the
# queue after sorting
while not qu.empty():
print(qu.get(), end = ' ')
# This code is contributed by Sadik Ali
C#
// Program to print the given pattern
using System;
using System.Collections.Generic;
class GFG
{
// Function to push element in last by
// popping from front until size becomes 0
static void FrontToLast(Queue q,
int qsize)
{
// Base condition
if (qsize <= 0)
return;
// pop front element and push
// this last in a queue
q.Enqueue(q.Peek());
q.Dequeue();
// Recursive call for pushing element
FrontToLast(q, qsize - 1);
}
// Function to push an element in the queue
// while maintaining the sorted order
static void pushInQueue(Queue q,
int temp, int qsize)
{
// Base condition
if (q.Count == 0 || qsize == 0)
{
q.Enqueue(temp);
return;
}
// If current element is less than
// the element at the front
else if (temp <= q.Peek())
{
// Call stack with front of queue
q.Enqueue(temp);
// Recursive call for inserting a front
// element of the queue to the last
FrontToLast(q, qsize);
}
else
{
// Push front element into
// last in a queue
q.Enqueue(q.Peek());
q.Dequeue();
// Recursive call for pushing
// element in a queue
pushInQueue(q, temp, qsize - 1);
}
}
// Function to sort the given
// queue using recursion
static void sortQueue(Queue q)
{
// Return if queue is empty
if (q.Count==0)
return;
// Get the front element which will
// be stored in this variable
// throughout the recursion stack
int temp = q.Peek();
// Remove the front element
q.Dequeue();
// Recursive call
sortQueue(q);
// Push the current element into the queue
// according to the sorting order
pushInQueue(q, temp, q.Count);
}
// Driver code
public static void Main(String[] args)
{
// Push elements to the queue
Queue qu = new Queue();
qu.Enqueue(10);
qu.Enqueue(7);
qu.Enqueue(16);
qu.Enqueue(9);
qu.Enqueue(20);
qu.Enqueue(5);
// Sort the queue
sortQueue(qu);
// Print the elements of the
// queue after sorting
while (qu.Count != 0)
{
Console.Write(qu.Peek() + " ");
qu.Dequeue();
}
}
}
// This code is contributed by Princi Singh
输出:
5 7 9 10 16 20