列车进站问题,Stack(应用)
来源:互联网 发布:为什么网络诈骗没人管 编辑:程序博客网 时间:2024/05/17 20:22
方法是用递归思想,模拟列车进站问题。
话不多说,直接代码,思路会在注释中见到。
#include<iostream>#include<vector>#include<stack>#include<iterator>using namespace std;const int N = 4;void fun(int k,vector<int>v,stack<int>s){ //stack 中的元素为入栈未出栈的元素,vector 中的元素是已出栈的元素,这里s1,v1是两个副本。 stack<int>s1 = s; vector<int>v1 = v; //所有列车已经进过站,输出列车的出站顺序 if(k>N) { //这个只是输出容器内的所有元素 copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); while(!s1.empty()) { cout<<s1.top()<<" "; s1.pop(); } cout<<endl; return; } //模仿已经进站的列车是否要出站,循环是将当前站内的所有列车的选择都模仿一遍 while(!s1.empty()) { v1.push_back(s1.top()); //栈顶列车出栈 s1.pop(); s1.push(k); //当前列出入栈 fun(k+1,v1,s1); s1.pop(); } //所有在站内的列车都不出站的情况 s.push(k); fun(k+1,v,s);}int main(){ vector<int>v; v.reserve(3); stack<int>s; fun(1,v,s); return 0;}
代码很简单,也不是很完美,可以稍作修改使得更简洁,但基本模仿了列车入站出站的情况也体现了思想。
这方法并非将所有排列组合(N!)计算出来,然后判断。如果要使用这种方法,仔细观察可以发现规律,出栈顺序中,在当前准备出栈的元素前面不能存在比当前元素大以及比当前元素小的元素,并且大的在小的前面。
举个简单的例子 1、2、3 。错误的出栈顺序:3、1、2 (在2前面有比2大的3且有比2小的1在3的后面)
再如 1、2、3、4、5 。错误的出栈顺序:4、3、1、2、5(在2的前面有比2大的4和3且有比2小的1在4、3的后面)。
要编程实现这个,按照这个规则去判断就可以了。
0 0
- 列车进站问题,Stack(应用)
- HDUOJ 1022 (栈的基本应用)火车进站问题I
- 火车进站问题(华为OJ)
- poj 1363 火车进站问题,栈的基本应用
- 栈的应用——火车进站出站问题
- 火车进站出站问题
- 火车进站问题
- 火车进站问题
- 火车进站问题
- HDU1022火车进站问题
- 火车进站问题
- 火车进站出站问题
- 赛车进站问题
- 火车进站问题
- stack模拟火车进站的方法
- 火车进站问题(栈思想,全排列)
- hdu1022火车进站(有关栈的基本问题)
- 全排列——火车进站问题(华为OJ)
- 自回归模型的LMS学习曲线-神经网络与机器学习笔记3
- 模型机设计(学习笔记)
- 11个免费的Web安全测试工具
- JQuery 一些简单的操作
- C语言:静态顺序表的增删查该,数据结构
- 列车进站问题,Stack(应用)
- java 设计模式之 -- 单例模式
- STM32中的最后面几句话的意思
- 基于Visual C++之Windows核心编程代码分析(4)获取操作系统信息
- android 实现文字大小兼容的方法
- Eclipse之GBK 编码
- 时间轴控件TimeLineView的实现
- 设计模式前传---UML图和六大设计原则
- 手机触屏事件