1 递归的翻转一个栈
2 递归的排序一个栈
两个操作均不借助其他数据结构
int in=0; // 入栈次数
int out=0; //出栈次数
// 不借助其他结构体,翻转一个栈中的元素,如 a,b,c -> c,b,a.
static void ReverseStack(stack<int> &st)
{
if (st.size() == 0)// 栈空,则返回
return;
int top = st.top(); //最上面的元素出栈
st.pop();
out++;
ReverseStack(st); // 剩下的n-1 个元素翻转
if (st.size() == 0) // 如果至于一个元素,则出栈的元素入栈,返回
{
st.push(top);
in++;
return;
}
int top2 = st.top();// 此时栈的大小为n-1,再一次出栈一个元素
st.pop();
out++;
ReverseStack(st);//剩下的n-2 个元素翻转
st.push(top);// top 入栈
in++;
ReverseStack(st);//n-1 个元素再一次翻转
st.push(top2); // top2 入栈
in++;
}
// 不借助其他结构体,栈中元素排序,栈顶最小,栈低最大
void sortStack(stack<int> &st){
if (st.size() == 0)
return;
int top = st.top();
st.pop();
sortStack(st);
if (st.size() == 0)
{
st.push(top);
return;
}
int top2 = st.top();
st.pop();
if(top>top2){
st.push(top);
sortStack(st);
st.push(top2);
}
else{
st.push(top2);
st.push(top);
}
}
void main(){
stack<int> st;
int n;
cout<<"input number:n (0 is over)";
cin>>n;
int num;
while(n){
in=0;
out=0;
cout<<"please input "<<n<<" integers:";
for(int i=0;i<n;i++){
cin>>num;
st.push(num);
}
ReverseStack(st);
stack<int> temp;
temp=st;
cout<<"翻转后的次序"<<endl;
while(!temp.empty()){
cout<<temp.top()<<" ";
temp.pop();
}
cout<<endl;
cout<<"in="<<in<<",out="<<out<<endl;
sortStack(st);
cout<<"排序后的次序"<<endl;
while(!st.empty()){
cout<<st.top()<<" ";
st.pop();
}
cout<<endl;
cout<<"input n=";
cin>>n;
}
}
一个栈元素为a,b,c,d,e 的翻转示意图
如算法1 ,时间复杂度可表示为 f(n)=f(n-1)+f(n-2)+f(n-1)+4 =2f(n-1)+f(n-2)+4; // 4 表示两次入栈,两次出栈
其中 f(0)=0,f(1)=2; 所以f(n)可以表示n个元素翻转的出栈入栈总次数。
算法2 的时间复杂度 与栈中元素初始化有关系。