📜  合并和排序两个未排序的堆栈

📅  最后修改于: 2021-04-27 05:06:49             🧑  作者: Mango

以未排序的方式给定2个输入堆栈和元素。问题是将它们合并到新的最终堆栈中,以使元素以排序的方式排列。

片段1
片段3

例子:

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

创建一个空堆栈以存储结果。我们首先将两个堆栈的元素插入结果中。然后,我们对结果堆栈进行排序。

C++
// C++ program to merge to unsorted stacks
// into a third stack in sorted way.
#include 
using namespace std;
  
// Sorts input stack and returns sorted stack.
stack sortStack(stack& input)
{
    stack 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 tempory of stack
        tmpStack.push(tmp);
    }
  
    return tmpStack;
}
  
stack sortedMerge(stack& s1, stack& s2)
{
    // Push contents of both stacks in result
    stack 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 function
int main()
{
    stack 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 tmpStack = sortedMerge(s1, s2);
    cout << "Sorted and merged stack :\n";
  
    while (!tmpStack.empty()) {
        cout << tmpStack.top() << " ";
        tmpStack.pop();
    }
}


Java
// 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 res = new Stack();
    static Stack tmpStack = new Stack();
      
    // Sorts input stack and returns 
    // sorted stack.
    static void sortStack(Stack 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 tempory of stack
            tmpStack.push(tmp);
        }
    }
      
    static void sortedMerge(Stack s1,
                                Stack 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 s1 = new Stack();
        Stack s2 = new Stack();
        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)


C#
// 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 sortStack(ref Stack input)
    {
        Stack tmpStack = new Stack();
      
        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 tempory of stack
            tmpStack.Push(tmp);
        }
      
        return tmpStack;
    }
      
    static Stack sortedMerge(ref Stack s1,
                                  ref Stack s2)
    {
        // Push contents of both stacks in result
        Stack res = new Stack();
        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 s1 = new Stack();
        Stack s2 = new Stack();
        s1.Push(34);
        s1.Push(3);
        s1.Push(31);
      
        s2.Push(1);
        s2.Push(12);
        s2.Push(23);
      
        // This is the temporary stack
        Stack tmpStack = new Stack();
        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)


输出:
Sorted and merged stack :
34 31 23 12 3 1