题目:用递归函数和栈逆序一个栈
OJ地址:传送门
题解
- 用栈实现输出反转
#include <iostream>
#include <stack>
using namespace std;
stack<int> st;
int main()
{
int N, X;
cin>>N;
while(N--)
{
cin>>X;
st.push(X);
}
while(!st.empty())
{
cout<<st.top();
st.pop();
cout<<(st.empty()?"\n":" ");
}
return 0;
}
- 用递归实现栈,进行输出反转
#include <iostream>
using namespace std;
int N;
void Reverse(int cnt)
{
int temp;
if(cnt-- == 0) return;
cin>>temp;
Reverse(cnt);
cout<<temp<<(cnt+1 == N?"\n":" ");
}
int main()
{
int N;
cin>>N;
Reverse(N);
return 0;
}
实现输出反转很容易,但本质上没有实现栈的反转。
若入数据栈顺序是12345,塞入递归栈中顺序则是54321,出递归栈塞入数据栈中顺序仍旧是12345,按照题意没有实现反转。
若使用递归,弹出栈底元素。可以实现栈中元素反转。
#include <iostream>
#include <stack>
using namespace std;
stack<int> st;
int PopLastNum(stack<int>& ss)
{
int num = ss.top();
ss.pop();
if(ss.empty()) return num;
int lastnum = PopLastNum(ss);
ss.push(num);
return lastnum;
}
void Reverse(stack<int>& ss)
{
if(ss.empty()) return;
int num = PopLastNum(ss);
Reverse(ss);
ss.push(num);
}
int main()
{
int N, X;
cin>>N;
while(N--)
{
cin>>X;
st.push(X);
}
Reverse(st);
while(!st.empty())
{
cout<<PopLastNum(st)<<(st.empty()?"\n":" ");
}
return 0;
}