📜  在另一个空堆栈的帮助下反转堆栈

📅  最后修改于: 2021-09-03 13:38:09             🧑  作者: Mango

给定一个由N 个元素组成的堆栈,任务是使用一个额外的堆栈来反转堆栈。

例子:

处理方法:按照以下步骤解决问题:

  • 初始化一个空栈。
  • 弹出给定堆栈 S 的顶部元素并将其存储在一个临时变量中。
  • 将给定堆栈的所有元素转移到上面初始化的堆栈。
  • 将临时变量推入原始堆栈。
  • 将新堆栈中存在的所有元素转移到原始堆栈中。

下面是上述方法的实现。

C++
// C++ program to reverse a stack
// by using an extra stack
#include 
using namespace std;
 
// Function to transfer elements of
// the stack s1 to the stack s2
void transfer(stack& s1,
              stack& s2, int n)
{
    for (int i = 0; i < n; i++) {
 
        // Store the top element
        // in a temporary variable
        int temp = s1.top();
 
        // Pop out of the stack
        s1.pop();
 
        // Push it into s2
        s2.push(temp);
    }
}
 
// Function to reverse a stack using another stack
void reverse_stack_by_using_extra_stack(stack& s,
                                        int n)
{
    stack s2;
 
    for (int i = 0; i < n; i++) {
 
        // Store the top element
        // of the given stack
        int x = s.top();
 
        // Pop that element
        // out of the stack
        s.pop();
 
        transfer(s, s2, n - i - 1);
        s.push(x);
        transfer(s2, s, n - i - 1);
    }
}
 
// Driver Code
int main()
{
    int n = 5;
 
    stack s;
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);
    s.push(5);
 
    reverse_stack_by_using_extra_stack(s, n);
 
    for (int i = 0; i < n; i++) {
        cout << s.top() << " ";
        s.pop();
    }
    return 0;
}


Java
// Java program to reverse a stack
// by using an extra stack
import java.io.*;
import java.util.*;
 
class GFG{
   
// Function to transfer elements of
// the stack s1 to the stack s2
static void transfer(Stack s1,
                     Stack s2, int n)
{
    for(int i = 0; i < n; i++)
    {
         
        // Store the top element
        // in a temporary variable
        int temp = s1.peek();
 
        // Pop out of the stack
        s1.pop();
 
        // Push it into s2
        s2.push(temp);
    }
}
 
// Function to reverse a stack using another stack
static void reverse_stack_by_using_extra_stack(Stack s,
                                               int n)
{
    Stack s2 = new Stack();
 
    for(int i = 0; i < n; i++)
    {
         
        // Store the top element
        // of the given stack
        int x = s.peek();
 
        // Pop that element
        // out of the stack
        s.pop();
 
        transfer(s, s2, n - i - 1);
        s.push(x);
        transfer(s2, s, n - i - 1);
    }
}
 
// Driver Code
public static void main(String[] args)
{
    int n = 5;
 
    Stack s = new Stack();
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);
    s.push(5);
 
    reverse_stack_by_using_extra_stack(s, n);
 
    for(int i = 0; i < n; i++)
    {
        System.out.print(s.peek() + " ");
        s.pop();
    }
}
}
 
// This code is contributed by Dharanendra L V.


Python3
# Python3 program to reverse a stack
# by using an extra stack
 
# Function to transfer elements of
# the stack s1 to the stack s2
def transfer(s1, s2, n):
     
    for i in range(n):
 
        # Store the top element
        # in a temporary variable
        temp = s1[-1]
 
        # Pop out of the stack
        s1.pop()
 
        # Push it into s2
        s2.append(temp)
 
# Function to reverse a stack using another stack
def reverse_stack_by_using_extra_stack(s, n):
 
    s2 = []
     
    for i in range(n):
 
        # Store the top element
        # of the given stack
        x = s[-1]
 
        # Pop that element
        # out of the stack
        s.pop()
 
        transfer(s, s2, n - i - 1)
        s.append(x)
        transfer(s2, s, n - i - 1)
 
# Driver Code
if __name__ == "__main__":
 
    n = 5
 
    s = []
    s.append(1)
    s.append(2)
    s.append(3)
    s.append(4)
    s.append(5)
 
    reverse_stack_by_using_extra_stack(s, n)
 
    for i in range(n):
        print(s[-1], end = " ")
        s.pop()
         
# This code is contributed by ukasp


C#
// C# program to reverse a stack
// by using an extra stack
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function to transfer elements of
// the stack s1 to the stack s2
static void transfer(Stack s1,
              Stack s2, int n)
{
    for (int i = 0; i < n; i++) {
 
        // Store the top element
        // in a temporary variable
        int temp = s1.Peek();
 
        // Pop out of the stack
        s1.Pop();
 
        // Push it into s2
        s2.Push(temp);
    }
}
 
// Function to reverse a stack using another stack
static void reverse_stack_by_using_extra_stack(Stack s,
                                        int n)
{
    Stack s2 = new Stack();
 
 
    for (int i = 0; i < n; i++) {
 
        // Store the top element
        // of the given stack
        int x = s.Peek();
 
        // Pop that element
        // out of the stack
        s.Pop();
 
        transfer(s, s2, n - i - 1);
        s.Push(x);
        transfer(s2, s, n - i - 1);
    }
}
 
// Driver Code
public static void Main()
{
    int n = 5;
 
    Stack s = new Stack();
 
    s.Push(1);
    s.Push(2);
    s.Push(3);
    s.Push(4);
    s.Push(5);
 
    reverse_stack_by_using_extra_stack(s, n);
 
    for (int i = 0; i < n; i++) {
        Console.Write(s.Peek() + " ");
        s.Pop();
    }
}
}
 
// This code is contributed by SURENDRA_GANGWAR.


Javascript


输出:
1 2 3 4 5

时间复杂度: O(N 2 )
辅助空间: O(N)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live