假设我们将 10、20、30、40、50 压入栈中,则元素在栈中从栈顶到栈底的顺序为:50、40、30、20、10。我们的目标是使用递归实现一个算法,将 Stack 容器中顺序进行逆序,变为:10、20、30、40、50。
实现该需求,我们要分为两步:
- 编写递归函数能够依次获得栈底元素。比如:我们栈中元素的从栈顶到栈底的顺序为:50、40、30、20、10,则我们的函数能够依次返回 10、20、30、40、50;
- 编写递归函数按照第一步获得的元素次序的逆序依次入栈。此时,我们依次可以获得 10、20、30、40、50,我们此时就按照逆序 50、40、30、20、10 的顺序依次压栈。此时,输出就变成了 10、20、30、40、50,达到了我们的目标。
我们先完成第一步,编写一个 get_stack_bottom_value 函数用于获得最后一个元素。注意:我们只获得栈底元素,其他元素并不会从栈中删除。
// 获得栈容器当前栈底元素,其他元素删除
template<class T>
T& get_stack_bottom_value(stack<T>& my_stack)
{
// 获得并弹出栈顶元素
T top_value = my_stack.top();
my_stack.pop();
// 如果栈空,说明 top_value 为栈底元素
if (my_stack.empty())
{
return top_value;
}
T bottom_value = get_stack_bottom_value(my_stack);
// 如果不是栈底元素则放回栈中
my_stack.push(top_value);
return bottom_value;
}
// 获得栈容器当前栈底元素,其他元素删除
template<class T>
T& get_stack_bottom_value(stack<T>& my_stack)
{
// 获得并弹出栈顶元素
T top_value = my_stack.top();
my_stack.pop();
// 如果栈空,说明 top_value 为栈底元素
if (my_stack.empty())
{
return top_value;
}
T bottom_value = get_stack_bottom_value(my_stack);
// 如果不是栈底元素则放回栈中
my_stack.push(top_value);
return bottom_value;
}
// 获得栈容器当前栈底元素,其他元素删除 template<class T> T& get_stack_bottom_value(stack<T>& my_stack) { // 获得并弹出栈顶元素 T top_value = my_stack.top(); my_stack.pop(); // 如果栈空,说明 top_value 为栈底元素 if (my_stack.empty()) { return top_value; } T bottom_value = get_stack_bottom_value(my_stack); // 如果不是栈底元素则放回栈中 my_stack.push(top_value); return bottom_value; }
接下来,编写 reverse_stack 函数实现栈中元素的逆序:
template<class T>
void reverse_stack(stack<T> &my_stack)
{
if (my_stack.empty())
{
return;
}
// 获得栈底元素
T bottom_value = get_stack_bottom_value(my_stack);
reverse_stack(my_stack);
my_stack.push(bottom_value);
}
template<class T>
void reverse_stack(stack<T> &my_stack)
{
if (my_stack.empty())
{
return;
}
// 获得栈底元素
T bottom_value = get_stack_bottom_value(my_stack);
reverse_stack(my_stack);
my_stack.push(bottom_value);
}
template<class T> void reverse_stack(stack<T> &my_stack) { if (my_stack.empty()) { return; } // 获得栈底元素 T bottom_value = get_stack_bottom_value(my_stack); reverse_stack(my_stack); my_stack.push(bottom_value); }
我们接下调用下 reverse_stack 函数,看看能否达到我们的要求:
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack<int> my_stack;
my_stack.push(10);
my_stack.push(20);
my_stack.push(30);
my_stack.push(40);
my_stack.push(50);
reverse_stack(my_stack);
while (!my_stack.empty())
{
cout << my_stack.top() << " ";
my_stack.pop();
}
return 0;
}
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack<int> my_stack;
my_stack.push(10);
my_stack.push(20);
my_stack.push(30);
my_stack.push(40);
my_stack.push(50);
reverse_stack(my_stack);
while (!my_stack.empty())
{
cout << my_stack.top() << " ";
my_stack.pop();
}
return 0;
}
#include <iostream> #include <stack> using namespace std; int main() { stack<int> my_stack; my_stack.push(10); my_stack.push(20); my_stack.push(30); my_stack.push(40); my_stack.push(50); reverse_stack(my_stack); while (!my_stack.empty()) { cout << my_stack.top() << " "; my_stack.pop(); } return 0; }
程序输出结果:
10 20 30 40 50
10 20 30 40 50
10 20 30 40 50
至此,搞定我们的需求。