递归翻转栈&递归栈排序
来源:互联网 发布:手机消息提醒软件 编辑:程序博客网 时间: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 的时间复杂度 与栈中元素初始化有关系。
- 递归翻转栈&递归栈排序
- 用递归方式将栈内容翻转
- 用递归的方法翻转一个栈
- 用递归翻转一个栈 Reverse a stack using recursion
- 从链表翻转的递归算法到递归与栈的关系
- 递归翻转字串
- 递归翻转字符串
- 递归翻转单链表
- 递归实现字符串翻转
- 递归 字符串翻转 问题解决
- 递归实现字符串翻转
- 递归翻转一个字符串
- 翻转二叉树(递归非递归)
- 单链表递归反转和非递归翻转
- 单链表翻转(递归与非递归)
- 递归排序
- 递归排序
- 递归排序
- 用chroot对付磁盘空间不足的情况
- LUANET实例化C# 类
- PHP 观察者模式
- 创建的模态对话框无法响应鼠标,只响应回车
- 数据结构(C语言版)
- 递归翻转栈&递归栈排序
- Session对象
- ava继承:重新使用接口问题
- java工程以jar的形式在linux中运行问题
- web架构设计经验分享
- 13-韩信点兵(算法)
- SD-Flasher在win7系统里面烧写SD卡的问题
- 二叉树算法引发的思考:指针参数传递、引用的陷阱
- seo的核心思想是什么