📜  使用两个空堆栈反转堆栈

📅  最后修改于: 2021-09-07 05:13:36             🧑  作者: Mango

给定一个堆栈S ,任务是使用两个额外的堆栈来反转堆栈S。

例子:

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

  1. 创建两个额外的空堆栈,比如AB
  2. 定义一个函数transfer() ,它接受两个堆栈XY作为参数并执行以下操作:
    1. X不为空时循环并执行以下操作:
      1. 将堆栈X的顶部元素推入Y
      2. X弹出该元素。
  3. 调用transfer(S, A) tos 将堆栈S 的所有元素转移到A 。 (元素的顺序是相反的)。
  4. 调用transfer(A, B)将堆栈A 的所有元素转移到B 。 (元素的顺序与S 中的初始顺序相同)
  5. 调用transfer(B, S)B 的所有元素转移到S 。 (元素顺序颠倒)
  6. 最后,显示堆栈S

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
  
// Function to transfer elements
// from the stack X to the stack Y
void transfer(stack& X,
              stack& Y)
{
    // Iterate while X is not empty
    while (!X.empty()) {
  
        // Push the top element
        // of X into Y
        Y.push(X.top());
  
        // Pop from X
        X.pop();
    }
}
  
// Function to display the
// contents of the stack S
void display(stack S)
{
    // Iterate while S is
    // not empty
    while (!S.empty()) {
  
        // Print the top
        // element of the stack S
        cout << S.top() << " ";
  
        // Pop from S
        S.pop();
    }
    cout << endl;
}
  
// Function to reverse a stack using two stacks
void reverseStackUsingTwoStacks(stack& S)
{
    // Two additional stacks
    stack A, B;
  
    // Transfer all elements
    // from the stack S to A
    transfer(S, A);
  
    // Transfer all elements
    // from the stack A to B
    transfer(A, B);
  
    // Transfer all elements
    // from the stack B to S
    transfer(B, S);
  
    // Print the contents of S
    display(S);
}
// Driver Code
int main()
{
    // Input
    stack S;
    S.push(5);
    S.push(4);
    S.push(3);
    S.push(2);
    S.push(1);
  
    // Function call
    reverseStackUsingTwoStacks(S);
  
    return 0;
}


输出:
5 4 3 2 1

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

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