Given a stack, sort it using recursion. Use of any loop constructs like while, for..etc is not allowed. We can only use the following ADT functions on 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.
Input: -3 <--- Top 14 18 -5 30 Output: 30 <--- Top 18 14 -3 -5
This problem is mainly a variant of Reverse stack using recursion.
The idea of the solution is to hold all values in Function Call Stack until the stack becomes empty. When the stack becomes empty, insert all held items one by one in sorted order. Here sorted order is important.
We can use below algorithm to sort stack elements:
sortStack(stack S) if stack is not empty: temp = pop(S); sortStack(S); sortedInsert(S, temp);
Below algorithm is to insert element is sorted order:
sortedInsert(Stack S, element) if stack is empty OR element > top element push(S, elem) else temp = pop(S) sortedInsert(S, element) push(S, temp)
Let given stack be -3 <-- top of the stack 14 18 -5 30
Let us illustrate sorting of stack using above example:
First pop all the elements from the stack and store poped element in variable ‘temp’. After poping all the elements function’s stack frame will look like:
temp = -3 --> stack frame #1 temp = 14 --> stack frame #2 temp = 18 --> stack frame #3 temp = -5 --> stack frame #4 temp = 30 --> stack frame #5
Now stack is empty and ‘insert_in_sorted_order()’ function is called and it inserts 30 (from stack frame #5) at the bottom of the stack. Now stack looks like below:
30 <-- top of the stack
Now next element i.e. -5 (from stack frame #4) is picked. Since -5 < 30, -5 is inserted at the bottom of stack. Now stack becomes:
30 <-- top of the stack -0
Next 18 (from stack frame #3) is picked. Since 18 < 30, 18 is inserted below 30. Now stack becomes:
30 <-- top of the stack 18 -5
Next 14 (from stack frame #2) is picked. Since 14 < 30 and 14 < 18, it is inserted below 18. Now stack becomes:
30 <-- top of the stack 18 14 -5
Now -3 (from stack frame #1) is picked, as -3 < 30 and -3 < 18 and -3 < 14, it is inserted below 14. Now stack becomes:
30 <-- top of the stack 18 14 -3 -5
Below is the implementation of the above algorithm.
Stack elements before sorting: -3 14 18 -5 30 Stack elements after sorting: 30 18 14 -3 -5
- Time Complexity: O(n2).
In the worst case for every sortstack(), sortedinsert() is called for ‘N’ times recursively for putting element to the right place
- Auxiliary Space: O(N)
Use of stack data structure for storing values
Exercise: Modify above code to reverse stack in descending order.
This article is contributed by Narendra Kangralkar. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
- Sort a stack using a temporary stack
- Reverse a stack using recursion
- Stack | Set 3 (Reverse a string using stack)
- Infix to Postfix using different Precedence Values for In-Stack and Out-Stack
- Find maximum in stack in O(1) without using additional stack
- Sort the Queue using Recursion
- Stack Permutations (Check if an array is stack permutation of other)
- stack empty() and stack size() in C++ STL
- Sort string of characters using Stack
- Sort the given stack elements based on their modulo with K
- Decimal to Binary using recursion and without using power operator
- Remove duplicates from a sorted linked list using recursion
- Reverse a Doubly linked list using recursion
- Sum of natural numbers using recursion
- Decimal to binary number using recursion
- Sum of digit of a number using recursion
- Binary to Gray code using recursion
- Product of 2 Numbers using Recursion
- Delete a linked list using recursion
- Program for length of a string using recursion