Description
栈是常用的一种数据结构,n个元素组成一个输入序列,在栈顶端一侧等待进栈,栈顶端另一端是出栈序列。已知栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出。由这两种操作组成的一个操作序列,可以唯一确定一个出栈序列。假设在输入序列中,没有相同元素。编程计算,对于给定的包含n个元素的输入序列,经过一系列的push和pop操作可能得到的出栈序列总数。
比如,有一个输入序列为:1、2、3,其出栈序列有:
3、2、1
2、3、1
2、1、3
1、3、2
1、2、3
出栈序列的总数为5。
Input
输入的第一行是一个正整数k,表示测试数据组数;接下来是k组测试数据,每组测试数据为一行,包含一个整数n(1<=n<=15),表示输入序列包含元素的个数。
Output
每组测试数据输出一行,包含一个整数,表示可能得到的输出序列总数。
Sample Input
2 2 3
Sample Output
2 5
KEY:这题有两种方法:一、用公式:C(2n,n)/(n+1);二、有算法:开个数组f,f[0][0]=1;
⑴i>0&&j>0 push f[i][j]=f[i-1][j+1]; ⑵i==0&&j>0 pop f[i][j]=f[i][j-1]; ⑶i>0&&j>0 push,pop f[i][j]=f[i-1][j+1]+f[i][j-1];//其中i表示栈外的元素,j表示栈中的元素;
Source:
#include < iostream >
using namespace std;
int f[ 20 ][ 20 ] = ... {1,0} ;
void StackOrderList()
... {
int i,j;
for(i=0;i<=20;i++)
for(j=0;j<=20;j++)
...{
if(i>0&&j==0) f[i][j]=f[i-1][j+1];
else if(i==0&&j>0) f[i][j]=f[i][j-1];
else if(i>0&&j>0) f[i][j]=f[i-1][j+1]+f[i][j-1];
}
}
int main()
... {
int N,n;
StackOrderList();
cin>>N;
for(int i=1;i<=N;i++)
...{
cin>>n;
cout<<f[n][0]<<endl;
}
return 0;
}
#include < iostream >
using namespace std;
int f[ 20 ][ 20 ] = ... {1,0} ;
void StackOrderList()
... {
int i,j;
for(i=0;i<=20;i++)
for(j=0;j<=20;j++)
...{
if(i>0&&j==0) f[i][j]=f[i-1][j+1];
else if(i==0&&j>0) f[i][j]=f[i][j-1];
else if(i>0&&j>0) f[i][j]=f[i-1][j+1]+f[i][j-1];
}
}
int main()
... {
int N,n;
StackOrderList();
cin>>N;
for(int i=1;i<=N;i++)
...{
cin>>n;
cout<<f[n][0]<<endl;
}
return 0;
}