列车进站问题,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
原创粉丝点击