×

Reverse a Stack using Recursion in C

In this tutorial we will learn how recursion will be used in this case to reverse a stack. For loops, while loops, do-while loops, and similar constructions are not permitted. To reverse a stack, we must use recursion.

Example:

Input: x = [15, 25, 35, 45, 55]
Output: [55, 45, 35, 25, 15]

Interpretation:

The result would be [ 55, 45, 35, 25, 15] if the stack x is flipped.

Recursion can be used to reverse a stack in several different ways. The use of an auxiliary stack is the most typical method of stack reversal. All of the components will first be removed from the stack and pushed into the auxiliary stack. After every item has been pushed into the auxiliary stack, we simply print the elements that are there in reverse order. However, we won't use the auxiliary stack in this case. Recursion refers to repeatedly calling the same function, which is how we will reverse a stack.

In the recursive procedure, all the elements from the input stack are first removed, and then all the removed elements are pushed into the function call stack until the stack is empty. All of the things will be moved toward the stack once it is empty. Let's use an example to better grasp this topic.

Example:

    5 <-- top
    6
    7
    8 


 8 is first put at the bottom.
    8 <-- top


Then, 7 is put at the bottom. 
   8 <-- top    
    7


Then, 6 is put at the bottom. 
    8 <-- top    
    7 
    6
     
Then, 5 is put at the bottom. 
    8 <-- top    
    7 
    6
    5

Application in C Language:

// Recursive C program that reverses a stack
#include<stdio.h>
#include<stdlib.h>
#define bool int


// structure of a stack node
struct xNode
{
	char val;
	struct xNode *next;
};


// Declaring Function
void push ( struct xNode** top_reference,
				int new_val );
int pop ( struct xNode** top_reference );
bool isEmpty ( struct xNode* top );
void print ( struct xNode* top );


// In this case, a recursive function aids in the insertion of a stack element at the bottom.
void insertAtBottom ( struct xNode** top_reference,
								int item )
{
	if ( isEmpty ( *top_reference ) )
		push ( top_reference, item );
	else
	{


	// Storing all items in Function Call
	// When the stack is empty, the if statement is evaluated and the item is added at the bottom when isEmpty(*top ref) is true.
		int temp_val = pop ( top_reference );
		insertAtBottom ( top_reference, item );


	// Push all the elements held in Function after the item has been inserted at the bottom. 
	// Calling Stack
		push ( top_reference, temp_val );
	}
}


// The function that uses insertAtBottom() to reverse the given stack is shown below
void reverse ( struct xNode** top_reference )
{
	if ( !isEmpty ( *top_reference ) )
	{
		// Until we reach the end of the stack, hold all the elements in the function and call stack.
		int temp_val = pop ( top_reference );
		reverse ( top_reference );


// putting each item (kept in the function call stack) in sequential order from bottom to top. Each item is placed at the bottom.
		insertAtBottom ( top_reference, temp_val );
	}
}


// Driver Code
int main ()
{
	struct xNode *x = NULL;
	push ( & x, 8 );
	push ( & x, 7 );
	push ( & x, 6 );
	push ( & x, 5 );


	printf ( "\nThe given Stack is - " );
	print ( x );
	reverse ( & x );
	printf ( "\nAnd the Reversed Stack is - " );
	print(x);
	return 0;
}


// Checking whether the stack is empty function
bool isEmpty ( struct xNode* top_element )
{
	if ( top_element==NULL )	return 1;
	else return 0;
}


// Function for inserting an item into a stack
void push ( struct xNode** top_reference,
					int new_val )
{
	
	// allocating the node into memory
	struct xNode* new_node =
		( struct xNode* ) malloc ( sizeof ( struct xNode ) );


	if ( new_node == NULL )
	{
		printf ( "Stack overflow \n" );
		exit ( 0 );
	}


	// putting in data
	new_node -> val = new_val; 


// Link the previous list to the new node.
	new_node -> next = ( *top_reference );


	// Point to the new node by moving the head.
	( *top_reference ) = new_node;
}


// Function to pop an item from stack
int pop ( struct xNode** top_reference )
{
	char res;
	struct xNode *top_element;


	// when stack is empty then it gives error
	if ( *top_reference == NULL )
	{
		printf ( "Stack overflow \n" );
		exit ( 0 );
	}
	else
	{
		top_element = *top_reference;
		res = top_element->val;
		*top_reference = top_element->next;
		free ( top_element );
		return res;
	}
}


// A linked list printing function
void print ( struct xNode* top_element )
{
	printf ( "\n" );
	while ( top_element != NULL) 
	{
		printf ( " %d ", top_element -> val );
		top_element = top_element -> next;
	}
}

Application in C++ Language:

// C++ code for reversing a 
// stack using recursion
#include<bits/stdc++.h>
using namespace std;
  
// stack declarations 
// using std::stack
stack < char > stack1;
  
// initialize a string to store
// result of the reversed stack
string str;
  
// The recursive function 
// that inserts an element
// at the bottom of a stackis given below.
void insert_at_bottom ( char a )
{
  
    if ( stack1.size () == 0 )
    stack1.push ( a );
  
    else
    {
          
        // All elements are held in Function Call
        // Stack until we reach to the end of the stack
        // When the stack became empty, the
        // stack1.size() became zero, when the above 
        // part is executed and the element is 
        // inserted at the bottom of the stack
              
        char b = stack1.top ();
        stack1.pop ();
        insert_at_bottom ( a );
  
        // pushing all the elements held in 
        // Function Call Stack
        // when the element is inserted
        // at the bottom of the stack
        stack1.push ( b );
    }
}
  
// The function that reverses 
// the given stack is shown below.
// insert_at_bottom()
void reverse ()
{
    if ( stack1.size () > 0 )
    {
          
        // Holding all the elements in Function 
        // Call Stack until we
        // reach to the end of the stack 
        char a = stack1.top ();
        stack1.pop ();
        reverse ();
          
        // Inserting all the elements held
        // in Function Call Stack
        // each of them from the bottom 
        // to top. Every item is then
        // inserted at the bottom of the stack 
        insert_at_bottom ( a );
    }
}
  
// Driver Code
int main ()
{
      
    // pushing the elements into 
    // the stack
    stack1.push ( '5' );
    stack1.push ( '6' );
    stack1.push ( '7' );
    stack1.push ( '8' );
      
    cout << "The given Stack is - "<< endl;
      
    // printing all the elements 
    // of the actual stack
    cout << "5 " << " " << "6" << " " 
        << "7" << " " << "8"
        << endl;
      
    // function for reversing 
    // the stack
    reverse ();
    cout << " And the Reversed Stack is -"
        << endl;
      
    // storing the values of the reversed 
    // stack in a string to display them
    while ( ! stack1.empty () ) 
    {
        char p=stack1.top ();
        stack1.pop ();
        str += p;
    }
      
    //displaying the reversed stack
    cout << str [ 3 ] <<" " << str [ 2 ]<<" "
        << str [ 1 ]<<" " << str [ 0 ] << endl;
    return 0;
}

Output:

The given Stack is -
5 6 7 8
And the Reversed Stack is -
8 7 6 5

Time Complexity: O (n2)

Space Complexity: O (1)


Related Topics

String in C

String is a collection of character or group of characters. In array, string of character is terminated by a null value “\0” and enclose between double quote. We can declare...

2 minutes read.

Use of free() function in C

Introduction The free() function uses in C programming language. The free() function in the C programming language uses to release or deallocate the memory blocks; these blocks are previously allocated by calloc(), malloc() or realloc()...

3 minutes read.

Assert() Function in C

Assert (): In C, the statements are executed with the exit statement. In C language declare, and it tests the condition parameters. If the statement executed will be false, it shows...

4 minutes read.

Nested if-else statement in C

If we use an if-else statement within another if statement in a C program, it is called a nested if-else statement in C. It helps to check the condition inside...

3 minutes read.

Cbrt() function in C

Introduction: The Cbrt is a function used in C programming language. The cbrt() function is a math function. Using the cbrt function, we can do the cube root of a function. This...

4 minutes read.

Type qualifiers in C

Type qualifiers in C: In the C programming language, type qualifiers are the keywords that prepend to the variables to change their accessibility, i.e., we can tell that the type...

4 minutes read.

How to open a C file on android mobile

A C file is a file that has a .c extension and contains code written in the C language. C is a computer programming language developed by Dennis Ritchie at...

4 minutes read.

C Math Library

C Math Library The <math.h> header defines various mathematical functions and one macro. Many functions are available in this library to take double as an argument and then return double as...

4 minutes read.

Built-in functions in C

The function is a set of instructions and statements enclosed in the "{}" delimiter. In c, there are two types of functions. Pre-define functions/ Built-in functionsUser define function. Built-in functions in C:- These...

8 minutes read.

clrscr in C

clrscr function in C clrscr stands for: clr = clear scr= screen When the clrscr() function is called in a program everything currently displayed in the console(output of previous programs, output of current program,...

3 minutes read.

Consumer billing system in C

Introduction : Billing has always been taught to do perfectly, we know today's world is full of products, and We all are using multiple products. We are buying and selling various...

9 minutes read.

GPA Calculator in C

GPA stands for Grade Point Average. This GPA is used to measure the student's academic performance in educational institutes. By using this, segregation takes place and lets us know how...

4 minutes read.

What is String Comparison in C

String comparison is the process of comparing two strings (sequences of characters) to determine if they are equal, or if one is greater or less than the other. The comparison...

4 minutes read.

Run Time Polymorphism in C

What is polymorphism? Polymorphism refers to the existence of various forms. Polymorphism can be simply defined as a message's capacity to be presented in multiple forms. An individual who can have...

4 minutes read.

Palindrome Number in C

What is a Palindrome? A number that doesn't change when reversed is known as a palindrome. We reverse a number and compare it to the original number to determine whether it is...

4 minutes read.

Control statement in C

What is a control statement? A control statement helps us to control the flow of the program. The control statement helps us to execute the program's instructions in a user-defined order....

8 minutes read.

Fibonacci series in C

We have learned about the Fibonacci series in mathematics. For a quick recap, A Fibonacci series is the sequence of numbers following a certain pattern i.e., the next number should...

3 minutes read.

C program to Store Information of Students Using Structure

What is the Structure in C? User-defined data types include structures. Structures aid your ability to combine things of various categories into a single group. Like arrays, it operates similarly. A...

3 minutes read.

GCD program in C

C language : Dennis Ritchie developed the general-purpose computer language C at Bell Laboratories in 1972. Despite being an ancient language, it is extremely popular. It is among the most widely used...

4 minutes read.

Errors in C

Errors in C Errors are nothing but problems or faults that pretty much occur in all the programming languages. Errors make the behavior of the program seem abnormal, and even the...

4 minutes read.