假设栈的输入序列为1、2、3、...、n,求出所有可能的出栈序列 - 开源中国社区
假设栈的输入序列为1、2、3、...、n,设计算法求出所有可能的出栈序列(合法序列)。
比如 n = 4,出栈序列可能有1 2 3 4 , 1 2 4 3 , 1 4 3 2 , 1 3 4 2等等
我使用递归来完成,主要思想:从1到n输入,每一个数只对应两个操作,一个是入栈,一个是出栈(输出),我用一个栈保存入栈元素,一个数组保存出栈元素(这里也可以使用栈,但是输出元素时,需要从反向输出)。
算法虽然简单,但是使用stack的时间代价相当高了,为什么不用数字的位模拟出入栈,用出入栈的顺序推导出数据输出的顺序?
Read full article from 假设栈的输入序列为1、2、3、...、n,求出所有可能的出栈序列 - 开源中国社区
假设栈的输入序列为1、2、3、...、n,设计算法求出所有可能的出栈序列(合法序列)。
比如 n = 4,出栈序列可能有1 2 3 4 , 1 2 4 3 , 1 4 3 2 , 1 3 4 2等等
我使用递归来完成,主要思想:从1到n输入,每一个数只对应两个操作,一个是入栈,一个是出栈(输出),我用一个栈保存入栈元素,一个数组保存出栈元素(这里也可以使用栈,但是输出元素时,需要从反向输出)。
算法虽然简单,但是使用stack的时间代价相当高了,为什么不用数字的位模拟出入栈,用出入栈的顺序推导出数据输出的顺序?
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
 | void print_valid_sequence(int i,const int n ) {     static int number = 0;//记录序列的个数     static Stack<int> stack;//保存入栈的元素     static int array[10];//保存输出的元素     int top;//用来取top     if(i == n+1)//递归结束条件,输出序列     {         ++number;         cout<<number<<"---";         for(int j = 0;j < n-stack.length();++j)            cout<<array[j];//正序输出         stack.print();//输出         cout<<endl;    }    else    {        stack.push(i);//入栈        print_valid_sequence(i+1,n);        stack.pop();//为保持stack不变,出栈        if(!stack.empty())//将栈顶元素输出        {            stack.getTop(top);            array[i-stack.length()-1] = top;//将输出的元素放入array中            stack.pop();            print_valid_sequence(i,n);//i不变            stack.push(top);        }    }} | 
有2n个人排成一队进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票可找零,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)。
对于这个例子,剧院要想总有零钱可找,那么目前进入剧院的人数中,揣着10元钞票的人数必须少于等于揣着5元钞票的,不然肯定在某个人那出现没零钱找的情况。
http://www.cnblogs.com/fxplove/articles/2500898.htmlRead full article from 假设栈的输入序列为1、2、3、...、n,求出所有可能的出栈序列 - 开源中国社区