Merging and Sorting Two Unsorted Stacks

14 Jun, 2022
Given 2 input stacks with elements in an unsorted manner. Problem is to merge them into a new final stack, such that the elements become arranged in a sorted manner. 
 
Examples:  
Input :  s1 : 9 4 2 1
         s2: 8 17 3 10
Output : final stack: 1 2 3 4 8 9 10 17

Input :  s1 : 5 7 2 6 4       
         s2 : 12 9 3 
Output : final stack: 2 3 4 5 6 7 9 12
 
Create an empty stack to store result. We first insert elements of both stacks into the result. Then we sort the result stack. 
C++
Java
Python3
C#
Javascript
// C++ program to merge to unsorted stacks// into a third stack in sorted way.#include <bits/stdc++.h>using namespace std; // Sorts input stack and returns sorted stack.stack<int> sortStack(stack<int>& input){    stack<int> tmpStack;     while (!input.empty()) {        // pop out the first element        int tmp = input.top();        input.pop();         // while temporary stack is not empty and top        // of stack is greater than temp        while (!tmpStack.empty() && tmpStack.top() > tmp) {             // pop from temporary stack and push            // it to the input stack            input.push(tmpStack.top());            tmpStack.pop();        }         // push temp in temporary of stack        tmpStack.push(tmp);    }     return tmpStack;} stack<int> sortedMerge(stack<int>& s1, stack<int>& s2){    // Push contents of both stacks in result    stack<int> res;    while (!s1.empty()) {        res.push(s1.top());        s1.pop();    }    while (!s2.empty()) {        res.push(s2.top());        s2.pop();    }     // Sort the result stack.    return sortStack(res);} // main functionint main(){    stack<int> s1, s2;    s1.push(34);    s1.push(3);    s1.push(31);     s2.push(1);    s2.push(12);    s2.push(23);     // This is the temporary stack    stack<int> tmpStack = sortedMerge(s1, s2);    cout << "Sorted and merged stack :\n";     while (!tmpStack.empty()) {        cout << tmpStack.top() << " ";        tmpStack.pop();    }}
// Java program to merge to unsorted stacks// into a third stack in sorted way.import java.io.*;import java.util.*; public class GFG {         // This is the temporary stack    static Stack<Integer> res = new Stack<Integer>();    static Stack<Integer> tmpStack = new Stack<Integer>();         // Sorts input stack and returns    // sorted stack.    static void sortStack(Stack<Integer> input)    {        while (input.size() != 0)        {            // pop out the first element            int tmp = input.peek();            input.pop();                 // while temporary stack is not empty and            // top of stack is greater than temp            while (tmpStack.size() != 0 &&                            tmpStack.peek() > tmp)            {                     // pop from temporary stack and push                // it to the input stack                input.push(tmpStack.peek());                tmpStack.pop();            }                 // push temp in temporary of stack            tmpStack.push(tmp);        }    }         static void sortedMerge(Stack<Integer> s1,                                Stack<Integer> s2)    {        // Push contents of both stacks in result        while (s1.size() != 0) {            res.push(s1.peek());            s1.pop();        }                 while (s2.size() != 0) {            res.push(s2.peek());            s2.pop();        }             // Sort the result stack.        sortStack(res);    }         // main function    public static void main(String args[])    {        Stack<Integer> s1 = new Stack<Integer>();        Stack<Integer> s2 = new Stack<Integer>();        s1.push(34);        s1.push(3);        s1.push(31);             s2.push(1);        s2.push(12);        s2.push(23);             sortedMerge(s1, s2);        System.out.println("Sorted and merged stack :");             while (tmpStack.size() != 0) {            System.out.print(tmpStack.peek() + " ");            tmpStack.pop();        }    }} // This code is contributed by Manish Shaw// (manishshaw1)
# Python3 program to merge to unsorted stacks# into a third stack in sorted way. # Sorts input stack and returns# sorted stack.def sortStack(Input):    tmpStack = []       while len(Input) != 0:        # pop out the first element        tmp = Input[-1]        Input.pop()           # while temporary stack is not empty and        # top of stack is greater than temp        while len(tmpStack) != 0 and tmpStack[-1] > tmp:            # pop from temporary stack and push            # it to the input stack            Input.append(tmpStack[-1])            tmpStack.pop()        # push temp in temporary of stack        tmpStack.append(tmp)    return tmpStack   def sortedMerge(s1, s2):    # Push contents of both stacks in result    res = []    while len(s1) !=0 :        res.append(s1[-1])        s1.pop()    while len(s2) !=0 :        res.append(s2[-1])        s2.pop()       # Sort the result stack.    return sortStack(res) s1 = []s2 = []s1.append(34)s1.append(3)s1.append(31) s2.append(1)s2.append(12)s2.append(23) # This is the temporary stacktmpStack = []tmpStack = sortedMerge(s1, s2)print("Sorted and merged stack :") while len(tmpStack) != 0 :    print(tmpStack[-1], end = " ")    tmpStack.pop()         # This code is contributed by decode2207.
// C# program to merge to unsorted stacks// into a third stack in sorted way.using System;using System.Collections.Generic; class GFG {         // Sorts input stack and returns    // sorted stack.    static Stack<int> sortStack(ref Stack<int> input)    {        Stack<int> tmpStack = new Stack<int>();             while (input.Count != 0)        {            // pop out the first element            int tmp = input.Peek();            input.Pop();                 // while temporary stack is not empty and            // top of stack is greater than temp            while (tmpStack.Count != 0 &&                              tmpStack.Peek() > tmp)            {                     // pop from temporary stack and push                // it to the input stack                input.Push(tmpStack.Peek());                tmpStack.Pop();            }                 // push temp in temporary of stack            tmpStack.Push(tmp);        }             return tmpStack;    }         static Stack<int> sortedMerge(ref Stack<int> s1,                                  ref Stack<int> s2)    {        // Push contents of both stacks in result        Stack<int> res = new Stack<int>();        while (s1.Count!=0) {            res.Push(s1.Peek());            s1.Pop();        }        while (s2.Count!=0) {            res.Push(s2.Peek());            s2.Pop();        }             // Sort the result stack.        return sortStack(ref res);    }         // main function    static void Main()    {        Stack<int> s1 = new Stack<int>();        Stack<int> s2 = new Stack<int>();        s1.Push(34);        s1.Push(3);        s1.Push(31);             s2.Push(1);        s2.Push(12);        s2.Push(23);             // This is the temporary stack        Stack<int> tmpStack = new Stack<int>();        tmpStack = sortedMerge(ref s1,ref s2);        Console.Write("Sorted and merged stack :\n");             while (tmpStack.Count!=0) {            Console.Write(tmpStack.Peek() + " ");            tmpStack.Pop();        }    }} // This code is contributed by Manish Shaw// (manishshaw1)
<script>    // Javascript program to merge to unsorted stacks    // into a third stack in sorted way.         // This is the temporary stack    let res = [];    let tmpStack = [];          // Sorts input stack and returns    // sorted stack.    function sortStack(input)    {        while (input.length != 0)        {            // pop out the first element            let tmp = input[input.length - 1];            input.pop();                  // while temporary stack is not empty and            // top of stack is greater than temp            while (tmpStack.length != 0 &&                            tmpStack[tmpStack.length - 1] > tmp)            {                      // pop from temporary stack and push                // it to the input stack                input.push(tmpStack[tmpStack.length - 1]);                tmpStack.pop();            }                  // push temp in temporary of stack            tmpStack.push(tmp);        }    }          function sortedMerge(s1, s2)    {        // Push contents of both stacks in result        while (s1.length != 0) {            res.push(s1[s1.length - 1]);            s1.pop();        }                  while (s2.length != 0) {            res.push(s2[s2.length - 1]);            s2.pop();        }              // Sort the result stack.        sortStack(res);    }         let s1 = [];    let s2 = [];    s1.push(34);    s1.push(3);    s1.push(31);     s2.push(1);    s2.push(12);    s2.push(23);     sortedMerge(s1, s2);    document.write("Sorted and merged stack :" + "</br>");     while (tmpStack.length != 0) {      document.write(tmpStack[tmpStack.length - 1] + " ");      tmpStack.pop();    }         // This code is contributed by divyesh072019.</script>
Sorted and merged stack :
34 31 23 12 3 1
 
Time Complexity: O((n+m)2) where n and m are number of elements in both the stacks respectively.Auxiliary Space: O(n+m) 
manishshaw1
decode2207
divyesh072019
anikakapoor
amankr0211
Sorting
Stack
Stack
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.