题目描述
栈是常用的一种数据结构,有n令元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列。你已经知道栈的操作有两•种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出。现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列。请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数。
输入
一个整数n(1<=n<=15)
输出
一个整数,即可能输出序列的总数目。
样例输入 Copy
3
样例输出 Copy
5
提示
先了解栈的两种基本操作,进栈push就是将元素放入栈顶,栈顶指针上移一位,等待进栈队列也上移一位,出栈pop是将栈顶元素弹出,同时栈顶指针下移一位。
用一个过程采模拟进出栈的过程,可以通过循环加递归来实现回溯:重复这样的过程,如果可以进栈则进一个元素,如果可以出栈则出一个元素。就这样一个一个地试探下去,当出栈元素个数达到n时就计数一次(这也是递归调用结束的条件)。
//分析:模拟栈的操作,每一步有两种选择:入栈和出栈,分别选择即可,重要的是判断还有没有次数
//下面是我AC的代码:
#include<bits/stdc++.h>
using namespace std;
int n, ans; //ans储存结果
void dfs(int in, int out, int num) { //in表示剩余的入栈次数,out表示剩余的出栈次数
if (!in && !out) { //入栈和出栈次数用完,说明生成了一个序列
ans++;
return;
}
if (in) dfs(in - 1, out, num + 1); //有入栈次数,就可以入栈
if (out && num) dfs(in, out - 1, num - 1); //有出栈次数并且栈内还有元素,就可以出栈
}
int main() {
cin >> n;
dfs(n, n, 0); //初始化为n n 0
cout << ans << endl; //输出结果
return 0;
}