题目描述
给你一个栈,请翻转栈里的元素.
要求:
1,只能在函数里定义常数级别的变量.
2,不用考虑复杂度,指数级,阶乘级复杂度都可以接受
3,除了基础的主函数以及输入外,关于算法逻辑的函数只能用下面接口
函数接口为:
void reverse(stack< int >& st){
//your code here
}
输入
第一行为一个数字N,表示栈的大小.(N<10
第二行为N个数字ai,从左往右表示从栈底到栈顶.
输出
将翻转后的栈输出,即输出顺序从栈顶到栈底
样例
输入:
5
1 2 3 4 5
输出:
1
2
3
4
5
#include <iostream>
#include <stack>
using namespace std;
void reverse(stack< int >& st){
if(st.empty()){
return;
}
int a=st.top();
st.pop();
if(st.empty()) {
st.push(a);
return;
}
else if(st.size()==1) {
int b=st.top();
st.pop();
st.push(a);
st.push(b);
} else {
reverse(st);
int b=st.top();
st.pop();
reverse(st);
st.push(a);
reverse(st);
st.push(b);
}
}
int main() {
stack<int> mystack;
int n,x;
cin>>n;
for(int i=0;i<n;i++){ //输入
cin>>x;
mystack.push(x);
}
reverse(mystack);
while (!mystack.empty()){ //输出
int a=mystack.top();
mystack.pop();
cout<<a<<endl;
}
return 0;
}
最近在学算法设计的递归,这道题卡了好几天。。。。。
一开始想的是怎么把栈底的元素取出来,然后再递归,但是再调用时函数已经变了,后来终于想明白了。
首先取出栈顶元素,对剩下的元素翻转,再取出栈顶,对剩下翻转,
例:
- 栈底 1 2 3 4 5 6 栈顶 //初始
->栈底 1 2 3 4 5 栈顶 存 6 //取栈顶
->栈底 5 4 3 2 1 栈顶 存 6 //翻转栈
->栈底 5 4 3 2 栈顶 存 6,1 //取栈顶
->栈底 2 3 4 5 栈顶 存 6,1 //翻转栈
->栈底 2 3 4 5 6 栈顶 存 1 //放栈顶
->下一次迭代
->返回后 把存的元素放回
希望这篇文章能对你有所帮助