给一系列的数1,2,3,,,n(有序的)和一个栈(stack),这个栈无线大,将这n个数据按照顺序放入栈中,但是随机的从栈中弹出,n=5,一共有多少中弹栈方式。
分析:卡特兰数的典型应用
这是卡特兰数的典型应用,Catalan数的定义令h(1)=1,Catalan数满足递归式:h(n)=h(1)*h(n-1) + h(2)*h(n-2)+…+h(n-1)h(1),n >= 2该递归关系的解:h(n) = C(2n,n)/(n+1),n=1,2,3…(其余C(2n,n)表示2n个中取n个的组和数)h(5) = C(10,5)/6 = 42
参考:这里
参考中有应用和性质
代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 int GetPopNum(int n) 4 { 5 int sum = 0 ,i; 6 if(n == 0 || n == 1) 7 return 1; 8 for(i = 1;i <= n;i++) 9 { 10 sum+=GetPopNum(i-1) * GetPopNum(n-i); 11 } 12 return sum; 13 } 14 int main() 15 { 16 int k = GetPopNum(5); 17 printf("%d",k); 18 }