题目描述
栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列。你已经知道栈的操作有两种:push和pop,前者是将一个元素进 栈,后者是将栈顶元素弹出。现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列。请你编程求出对于给定的n,计算并输出由操作数序列 1,2,…,n,经过一系列操作可能得到的输出序列总数。
【输入】 一个整数n(1<=n<=15)
【输出】 一个整数,即可能输出序列的总数目。
输入
3
输出
5
解析:
a代表未入栈的,b代表站内。
1、a>0,b>0 时有两中情况:
<1>往栈内压入一个,则未入栈的减少一个,站内多一个。
<2>出栈一个,则未入栈的不变,站内减少一个。
2、a ==0, b>0 时只能出栈一个,则栈内减少一个。
3、b ==0, a>0 时栈内没有元素,出不了站只能进栈,则未入栈的减少一个,栈内多一个。
利用递归可遍历所有的情况。
递归出口:未入栈的元素和栈内的元素都为0时。
代码实现:
#include <iostream>
using namespace std;
int s(int a,int b)
{
if(a==0&&b==0)
return 1;
else if(a>0&&b>0)
return s(a-1,b+1)+s(a,b-1);
else{
if(a==0)
return s(a,b-1);
if(b==0)
return s(a-1,b+1);
}
}
int main()
{
int n;
cin>>n;
cout<<s(n,0)<<endl;
return 0;
}