这是一个排列组合的问题,赫赫有名的卡特兰数
举例说明,共有一个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)