//题目:给定一个栈,使用递归方法将其逆序;
#include<iostream>
#include<stack>
using namespace std;
//核心算法:递归本质上是一个栈,其依次将栈s的栈顶pop后push在计算机内存的栈中,直到s栈空后,再从内存中
//的栈pop并重新push到s中
//该函数目标是获取栈s的栈底,并将栈底去除
int get_and_remove_last(stack<int> &s){
int top = s.top(); //先从s中pop出栈顶元素
s.pop();
if(s.empty()){//如果此时栈为空,则返回此时的top,该元素为s的栈底元素
return top;
}else {
int last = get_and_remove_last(s);//递归,再次获取pop一次后的栈顶元素,直到s为空时,此时递归结束,获得栈底元素
s.push(top);//开始回溯,依次入栈
return last;
}
}
//算法入口,递归地对当前的s获取栈底并移除栈底,然后入栈
void reverse_stack(stack<int> &s){
if(!s.empty()){
int bottom = get_and_remove_last(s);//获得s的栈底元素,并将s的栈底删除掉
reverse_stack(s);//递归获得最新的s的栈底,并删除,直到获得所有的栈底
s.push(bottom);//依次将最后一次得到的栈底元素再次入栈,此时入栈顺序与s是逆序的
}
}
int main(){
stack<int> s;
int n;
cin >> n;
cout<<"origin push order:\n";
for(int i=1;i<=n;i++){
s.push(i);
// cout<<i<<' ';
}
reverse_stack(s);
cout<<"\nreverse pop order:\n";
while(!s.empty()){
int top = s.top();
s.pop();
// cout<<top<<' ';
}
system("pause");
return 0;
}