递归翻转栈&递归栈排序

来源:互联网 发布:手机消息提醒软件 编辑:程序博客网 时间:2024/05/16 01:17

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 的时间复杂度 与栈中元素初始化有关系。