给定一个堆栈S ,任务是使用两个额外的堆栈来反转堆栈S。
例子:
Input: S={1, 2, 3, 4, 5}
Output: 5 4 3 2 1
Explanation:
The initial stack S:
1→top
2
3
4
5
After reversing it, use two additional stacks:
5→top
4
3
2
1
Input: S={1, 25, 17}
Output: 17 25 1
处理方法:按照以下步骤解决问题:
- 创建两个额外的空堆栈,比如A和B 。
- 定义一个函数transfer() ,它接受两个堆栈X和Y作为参数并执行以下操作:
- 当X不为空时循环并执行以下操作:
- 将堆栈X的顶部元素推入Y 。
- 从X弹出该元素。
- 当X不为空时循环并执行以下操作:
- 调用transfer(S, A) tos 将堆栈S 的所有元素转移到A 。 (元素的顺序是相反的)。
- 调用transfer(A, B)将堆栈A 的所有元素转移到B 。 (元素的顺序与S 中的初始顺序相同)
- 调用transfer(B, S)将B 的所有元素转移到S 。 (元素顺序颠倒)
- 最后,显示堆栈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