Ordenar una pila usando recursividad

Dada una pila, ordénela usando recursividad. No se permite el uso de construcciones de bucle como while, for, etc. Solo podemos usar las siguientes funciones ADT en Stack S: 

is_empty(S)  : Tests whether stack is empty or not.
push(S)      : Adds new element to the stack.
pop(S)       : Removes top element from the stack.
top(S)       : Returns value of the top element. Note that this
               function does not remove element from the stack.

Ejemplo: 

C++

// C++ program to sort a stack using recursion
#include <iostream>
using namespace std;
 
// Stack is represented using linked list
struct stack {
    int data;
    struct stack* next;
};
 
// Utility function to initialize stack
void initStack(struct stack** s) { *s = NULL; }
 
// Utility function to check if stack is empty
int isEmpty(struct stack* s)
{
    if (s == NULL)
        return 1;
    return 0;
}
 
// Utility function to push an item to stack
void push(struct stack** s, int x)
{
    struct stack* p = (struct stack*)malloc(sizeof(*p));
 
    if (p == NULL) {
        fprintf(stderr, "Memory allocation failed.\n");
        return;
    }
 
    p->data = x;
    p->next = *s;
    *s = p;
}
 
// Utility function to remove an item from stack
int pop(struct stack** s)
{
    int x;
    struct stack* temp;
 
    x = (*s)->data;
    temp = *s;
    (*s) = (*s)->next;
    free(temp);
 
    return x;
}
 
// Function to find top item
int top(struct stack* s) { return (s->data); }
 
// Recursive function to insert an item x in sorted way
void sortedInsert(struct stack** s, int x)
{
    // Base case: Either stack is empty or newly inserted
    // item is greater than top (more than all existing)
    if (isEmpty(*s) or x > top(*s)) {
        push(s, x);
        return;
    }
 
    // If top is greater, remove the top item and recur
    int temp = pop(s);
    sortedInsert(s, x);
 
    // Put back the top item removed earlier
    push(s, temp);
}
 
// Function to sort stack
void sortStack(struct stack** s)
{
    // If stack is not empty
    if (!isEmpty(*s)) {
        // Remove the top item
        int x = pop(s);
 
        // Sort remaining stack
        sortStack(s);
 
        // Push the top item back in sorted stack
        sortedInsert(s, x);
    }
}
 
// Utility function to print contents of stack
void printStack(struct stack* s)
{
    while (s) {
        cout << s->data << " ";
        s = s->next;
    }
    cout << "\n";
}
 
// Driver code
int main(void)
{
    struct stack* top;
 
    initStack(&top);
    push(&top, 30);
    push(&top, -5);
    push(&top, 18);
    push(&top, 14);
    push(&top, -3);
 
    cout << "Stack elements before sorting:\n";
    printStack(top);
 
    sortStack(&top);
    cout << "\n";
 
    cout << "Stack elements after sorting:\n";
    printStack(top);
 
    return 0;
}
 
// This code is contributed by SHUBHAMSINGH10

C

// C program to sort a stack using recursion
#include <stdio.h>
#include <stdlib.h>
 
// Stack is represented using linked list
struct stack {
    int data;
    struct stack* next;
};
 
// Utility function to initialize stack
void initStack(struct stack** s) { *s = NULL; }
 
// Utility function to check if stack is empty
int isEmpty(struct stack* s)
{
    if (s == NULL)
        return 1;
    return 0;
}
 
// Utility function to push an item to stack
void push(struct stack** s, int x)
{
    struct stack* p = (struct stack*)malloc(sizeof(*p));
 
    if (p == NULL) {
        fprintf(stderr, "Memory allocation failed.\n");
        return;
    }
 
    p->data = x;
    p->next = *s;
    *s = p;
}
 
// Utility function to remove an item from stack
int pop(struct stack** s)
{
    int x;
    struct stack* temp;
 
    x = (*s)->data;
    temp = *s;
    (*s) = (*s)->next;
    free(temp);
 
    return x;
}
 
// Function to find top item
int top(struct stack* s) { return (s->data); }
 
// Recursive function to insert an item x in sorted way
void sortedInsert(struct stack** s, int x)
{
    // Base case: Either stack is empty or newly inserted
    // item is greater than top (more than all existing)
    if (isEmpty(*s) || x > top(*s)) {
        push(s, x);
        return;
    }
 
    // If top is greater, remove the top item and recur
    int temp = pop(s);
    sortedInsert(s, x);
 
    // Put back the top item removed earlier
    push(s, temp);
}
 
// Function to sort stack
void sortStack(struct stack** s)
{
    // If stack is not empty
    if (!isEmpty(*s)) {
        // Remove the top item
        int x = pop(s);
 
        // Sort remaining stack
        sortStack(s);
 
        // Push the top item back in sorted stack
        sortedInsert(s, x);
    }
}
 
// Utility function to print contents of stack
void printStack(struct stack* s)
{
    while (s) {
        printf("%d ", s->data);
        s = s->next;
    }
    printf("\n");
}
 
// Driver code
int main(void)
{
    struct stack* top;
 
    initStack(&top);
    push(&top, 30);
    push(&top, -5);
    push(&top, 18);
    push(&top, 14);
    push(&top, -3);
 
    printf("Stack elements before sorting:\n");
    printStack(top);
 
    sortStack(&top);
    printf("\n\n");
 
    printf("Stack elements after sorting:\n");
    printStack(top);
 
    return 0;
}

Java

// Java program to sort a Stack using recursion
// Note that here predefined Stack class is used
// for stack operation
 
import java.util.ListIterator;
import java.util.Stack;
 
class Test
{
    // Recursive Method to insert an item x in sorted way
    static void sortedInsert(Stack<Integer> s, int x)
    {
        // Base case: Either stack is empty or newly
        // inserted item is greater than top (more than all
        // existing)
        if (s.isEmpty() || x > s.peek())
        {
            s.push(x);
            return;
        }
 
        // If top is greater, remove the top item and recur
        int temp = s.pop();
        sortedInsert(s, x);
 
        // Put back the top item removed earlier
        s.push(temp);
    }
 
    // Method to sort stack
    static void sortStack(Stack<Integer> s)
    {
        // If stack is not empty
        if (!s.isEmpty())
        {
            // Remove the top item
            int x = s.pop();
 
            // Sort remaining stack
            sortStack(s);
 
            // Push the top item back in sorted stack
            sortedInsert(s, x);
        }
    }
 
    // Utility Method to print contents of stack
    static void printStack(Stack<Integer> s)
    {
        ListIterator<Integer> lt = s.listIterator();
 
        // forwarding
        while (lt.hasNext())
            lt.next();
 
        // printing from top to bottom
        while (lt.hasPrevious())
            System.out.print(lt.previous() + " ");
    }
 
    // Driver code
    public static void main(String[] args)
    {
        Stack<Integer> s = new Stack<>();
        s.push(30);
        s.push(-5);
        s.push(18);
        s.push(14);
        s.push(-3);
 
        System.out.println(
            "Stack elements before sorting: ");
        printStack(s);
 
        sortStack(s);
 
        System.out.println(
            " \n\nStack elements after sorting:");
        printStack(s);
    }
}

Python3

# Python program to sort a stack using recursion
 
# Recursive method to insert element in sorted way
 
 
def sortedInsert(s, element):
 
    # Base case: Either stack is empty or newly inserted
    # item is greater than top (more than all existing)
    if len(s) == 0 or element > s[-1]:
        s.append(element)
        return
    else:
 
        # Remove the top item and recur
        temp = s.pop()
        sortedInsert(s, element)
 
        # Put back the top item removed earlier
        s.append(temp)
 
# Method to sort stack
 
 
def sortStack(s):
 
    # If stack is not empty
    if len(s) != 0:
 
        # Remove the top item
        temp = s.pop()
 
        # Sort remaining stack
        sortStack(s)
 
        # Push the top item back in sorted stack
        sortedInsert(s, temp)
 
# Printing contents of stack
 
 
def printStack(s):
    for i in s[::-1]:
        print(i, end=" ")
    print()
 
 
# Driver Code
if __name__ == '__main__':
    s = []
    s.append(30)
    s.append(-5)
    s.append(18)
    s.append(14)
    s.append(-3)
 
    print("Stack elements before sorting: ")
    printStack(s)
 
    sortStack(s)
 
    print("\nStack elements after sorting: ")
    printStack(s)
 
# This code is contributed by Muskan Kalra.

C#

// C# program to sort a Stack using recursion
// Note that here predefined Stack class is used
// for stack operation
using System;
using System.Collections;
 
public class GFG
{
    // Recursive Method to insert an item x in sorted way
    static void sortedInsert(Stack s, int x)
    {
        // Base case: Either stack is empty or
        // newly inserted item is greater than top
        // (more than all existing)
        if (s.Count == 0 || x > (int)s.Peek()) {
            s.Push(x);
            return;
        }
 
        // If top is greater, remove
        // the top item and recur
        int temp = (int)s.Peek();
        s.Pop();
        sortedInsert(s, x);
 
        // Put back the top item removed earlier
        s.Push(temp);
    }
 
    // Method to sort stack
    static void sortStack(Stack s)
    {
        // If stack is not empty
        if (s.Count > 0) {
            // Remove the top item
            int x = (int)s.Peek();
            s.Pop();
 
            // Sort remaining stack
            sortStack(s);
 
            // Push the top item back in sorted stack
            sortedInsert(s, x);
        }
    }
 
    // Utility Method to print contents of stack
    static void printStack(Stack s)
    {
        foreach(int c in s) { Console.Write(c + " "); }
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        Stack s = new Stack();
        s.Push(30);
        s.Push(-5);
        s.Push(18);
        s.Push(14);
        s.Push(-3);
 
        Console.WriteLine(
            "Stack elements before sorting: ");
        printStack(s);
 
        sortStack(s);
 
        Console.WriteLine(
            " \n\nStack elements after sorting:");
        printStack(s);
    }
}
 
// This code is Contributed by Arnab Kundu

Javascript

<script>
 
// JavaScript program to sort a Stack using recursion
// Note that here predefined Stack class is used
// for stack operation
 
// Recursive Method to insert an item x in sorted way
function sortedInsert(s,x)
{
    // Base case: Either stack is empty or newly
        // inserted item is greater than top (more than all
        // existing)
        if (s.length==0 || x > s[s.length-1])
        {
            s.push(x);
            return;
        }
  
        // If top is greater, remove the top item and recur
        let temp = s.pop();
        sortedInsert(s, x);
  
        // Put back the top item removed earlier
        s.push(temp);
}
 
// Method to sort stack
function sortStack(s)
{
    // If stack is not empty
        if (s.length!=0)
        {
            // Remove the top item
            let x = s.pop();
  
            // Sort remaining stack
            sortStack(s);
  
            // Push the top item back in sorted stack
            sortedInsert(s, x);
        }
}
 
// Utility Method to print contents of stack
function printStack(s)
{
    for(let i=s.length-1;i>=0;i--)
    {
        document.write(s[i]+" ");
    }
    document.write("<br>")
}
     
 // Driver code   
let s=[];
 
s.push(30);
s.push(-5);
s.push(18);
s.push(14);
s.push(-3);
 
document.write(
"Stack elements before sorting: <br>");
printStack(s);
 
sortStack(s);
 
document.write(
" <br><br>Stack elements after sorting:<br>");
printStack(s);
 
 
// This code is contributed by avanitrachhadiya2155
 
</script>

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *