有两个栈,S1和S2,其中S1中有n个不同的元素,S2为空。现在可以做这样两种操作:
1)从S1中取出一个元素放入S2中;
2)将S2最顶端元素弹出(弹出元素计入弹出序列,不再参与下面的操作)。
直到所有元素都被弹出为止,问不同的弹出顺序有多少种?
输入
输入包含多组数据。每组数据包含一个数n(n<=20),为元素个数。
输出
对于每一组输入,输出一行一个整数,即不同的弹出顺序有多少种。
样例输入
4
样例输出
14
提示
样例的弹出顺序可以是:1234、1243、1324、1342、1432、2134、2143、2314、2341、2431、3214、3241、3421、4321这14种。
#include<stdio.h>
#define MaxLen 10
struct node{
int data[MaxLen];
int top;
}s;
int total=4;
void Initstack()
{s.top=-1;}
void push(int n)
{
s.top++;
s.data[s.top]=n;
}
int pop()
{
int temp;
temp=s.data[s.top];
s.top--;
return temp;
}
int Emptys()
{
if (s.top==-1) return 1;
else return 0;
}
void process(int pos,int path[],int curp)
{
int m,i;
if (pos<total)
{
push(pos+1);
process(pos+1,path,curp);
pop();
}
if (!Emptys())
{
m=pop();
path[curp]=m;
curp++;
process(pos,path,curp);
push(m);
}
if (pos==total && Emptys())
{
for (i=0;i<curp;i++)
printf("%d",path[i]);
printf("\n");
}
}
void main()
{
int path[MaxLen];
Initstack();
push(1);
printf("所有输出序列:\n");
process(1,path,0);
}