关于N个数1--N数顺序入栈,有多少种出栈方式的问题

这是一个排列组合的问题,赫赫有名的卡特兰数

举例说明,共有一个1,2,3,4四个数,入栈方式有
1入,2入,3入,4入,4出,3出,2出,1出 故出栈顺序4,3,2,1
1入,1出,2入,3入,4入,4出,3出,2出 故出栈顺序1,4,3,2
1入,1出,2入,2出,3入,4入,4出,3出 故出栈顺序1,2,4,3
1入,1出,2入,2出,3入,3出,4入,4出 故出栈顺序1,2,3,4
1入,2入,2出,3入,4入,4出,3出,1出 故出栈顺序2,4,3,1
... ...

实际上解决此问题可以这样做:假设n个元素的出栈有 H(n)种方式,对于n>=2

假设索引为i个元素第一个出栈,那么后面的出栈方式分为两块,一个是 1-- i-1的出栈方式,其有H(i-1),另外是i+1至n的出栈方式,共有H(n-i):
故其对于元素索引为i的元素第一个出栈共有H(i-1)*H(N-i)种出栈方式
那么
H(N) = H(1-1)*H(N-1)+(2-1)*(N-2)+....+H(N-1)*H(1-1)取H(0)=1,H(1)=1,这是一个标准的求取卡特兰数问题

C语言代码实现为一下:递归实现
int  catlin( int  N )
{
                  if  (0 ==  N  || 1 ==  N return  1;
                  int  sum = 0;
                  for  ( int  i = 0; i <  N ; i++)
                                sum += catlin(i)*catlin(  N  - i - 1);
                  return  sum;
}

对应的排列组合为C(2n,n) - C(2n,n+1)

你可能感兴趣的:(数据结构与算法)