问题
栈是常用的一种数据结构,有n令元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列。你已经知道栈的操作有两•种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出。现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列。请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数。
输入
一个整数n(1<=n<=15)
输出
一个整数,即可能输出序列的总数目。
思路
按照字典序递增的顺序依次进行,有n个元素,对应有n个步骤,在每一个步骤有两种选择
代码
#include<cstdio>
#include<stack>
using namespace std;
int n,ans=0;//n为进行步骤的值
void dfs(int inNum,int outNum){
//inNum 入栈数 outNum 出栈数 num栈内剩余元素个数
if(inNum==n||outNum==n){
ans++;
return;
}
if(inNum<n){
dfs(inNum+1,outNum);
//入栈次数 少于全部元素 可以入栈 入栈
}
if(outNum<n&&outNum<inNum) {
dfs(inNum,outNum+1);
//出栈次数少于入栈次数 栈中有元素可以出栈 出栈
}
}
int main()
{
while(scanf("%d",&n)==1){
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}
//运行时间超限 模拟入栈出栈的具体过程 模拟了就会超限