N个数依次入栈,出栈顺序有多少种?
//模拟过程如下,dfs来填充入栈和出栈的标志
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
#define N 100
using namespace std; int a[N];
int p[*N];
int pre[*N];
int used[*N];
int index[*N];//如果a[i]==1,那么表示第index[i]个数入栈
int n;
int cnt;//记录多少个出栈的序列 int C(int n){
int ans=;
int m = *n;
int nn = n;
for(int i=; i<=n; ++i){
ans *= m--;
ans /= i;
}
return ans/(nn+);
} void solve(){
memset(pre, , sizeof(pre));
memset(used, , sizeof(used));
int prek = ;
for(int i=; i<=*n; ++i){
if(a[i] == ){
pre[i] = prek;
prek = i;
} else {
int ii = prek;
while(used[ii])
ii = pre[ii];
cout<<p[index[ii]]<<" ";//出栈
used[ii] = ;
pre[prek] = pre[ii];
}
}
cout<<endl;
} void solve1(){
stack<int>s;
int k=;
for(int i=; i<=*n; ++i){
if(a[i] == )
s.push(p[k++]);
else {
cout<<s.top()<<" ";
s.pop();
}
}
cout<<endl;
} void dfs(int k, int cnt0, int cnt1){
if(k>*n){
//solve();
solve1();
++cnt;
return ;
}
if(cnt1<n){//入栈
a[k] = ;
index[k] = cnt1+;//第几个数入栈
dfs(k+, cnt0, cnt1+);
}
if(cnt0<cnt1){//出栈
a[k] = ;
dfs(k+, cnt0+, cnt1);
}
} int main(){
cin>>n;
for(int i=; i<=n; ++i)
cin>>p[i];
dfs(, , );
cout<<endl<<"模拟个数:"<<cnt<<endl;
cout<<"公式个数:"<<C(n)<<endl;
return ;
}
N个数依次入栈,出栈顺序有多少种?的更多相关文章
- N个数依次入栈,出栈顺序有多少种
题目:N个数依次入栈,出栈顺序有多少种? 首先介绍一下卡特兰数:卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 2 ...
- n个元素的入栈顺序有多少种出栈顺序?
问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的 ...
- 【转】【数据结构】【有n个元素依次进栈,则出栈序列有多少种】
卡特兰数 大神解释:https://blog.csdn.net/akenseren/article/details/82149145 权侵删 原题 有一个容量足够大的栈,n个元素以一定的顺序 ...
- bzoj 4034 [HAOI2015]树上操作 入栈出栈序+线段树 / 树剖 维护到根距离和
题目大意 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...
- php栈的定义及入栈出栈的实现 算法
转自:php栈的定义及入栈出栈的实现 栈是线性表的一种,他的特点是后入先出,可以这么理解,栈就像一个存东西的盒子,先放进去的在最底层,后放进去的在上层,因为上层的东西把底层的东西压住了,下层的想要出去 ...
- [置顶] 栈/入栈/出栈顺序(c语言)-linux
说明: 1.栈底为高地址,栈顶为低地址. 2.入栈顺序:从右到左. 解释1:栈在内存中的结构 [注:0x00 到 0x04之间间隔4个地址] 入栈:指针先指向0x10,从高地址向低地址方向填数值,最终 ...
- Python模拟入栈出栈操作
目标: 1.编写菜单,提示用户操作选项(push,pop,view,quit) 2.规则:定义列表,先入栈,后出栈,后入栈,先出栈 1.模拟入栈.出栈操作 >>> list1 = [ ...
- 5, java数据结构和算法: 栈 , 入栈, 出栈, 正序遍历,,逆序遍历
直接上代码: class ArrayStack{ //用数组模拟栈 int maxSize; int[] stack; int top = -1;//表示栈顶 public ArrayStack(in ...
- 对Viewcontroller在UINavigationController中入栈出栈的一点点理解
转载自:http://blog.csdn.net/intheair100/article/details/41119073 wait_record_arr 在viewdidload里面被alloc,如 ...
随机推荐
- Ajax完整篇(转载)
Ajax 完整教程 第 1 页 Ajax 简介Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用 ...
- asp.net实现数据库版动态网页滑动门
前端: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="滑动门.aspx.c ...
- Find Peak Element
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- 浏览器兼容性-JS篇
总结一下平时遇到的浏览器兼容性问题,本篇关于JS. 1.事件绑定 兼容写法: function add(obj,event){ if (obj.addEventListener) { obj.addE ...
- Spring的三种通过XML实现DataSource注入方式
Spring的三种通过XML实现DataSource注入方式: 1.使用Spring自带的DriverManagerDataSource 2.使用DBCP连接池 3.使用Tomcat提供的JNDI
- 编译安装PHP的参数 --with-mysql --with-mysqli --with-apxs2默认路径
编译安装PHP时指定如下几个参数说明: --with-apxs2=/usr/local/apache/bin/apxs //整合apache,apxs功能是使用mod_so中的LoadModule指令 ...
- 通过反射获取DLL的类实现加载窗体
1.创建一个DLL 类库,并新建一个窗体类,这个直接在vs上操作就好 2. 建立一个Testassembly工程 新建一个测试类 namespace Testassembly { public par ...
- windows下C++高精度计时
写代码时,经常会计算某一段代码的运行时间,以下提供一个微秒级别的类供参考 class CTimeCost { public: CTimeCost(const string &str) : m_ ...
- jetty项目中静态文件不能修改问题
修改web.xml 在web.xml中加入如下代码: <servlet> <servlet-name>default</servlet-name> <serv ...
- Oracle_R12C_安装注意点_Win64_exectask
安装问题1 原因 - 无法访问临时位置. 操作 - 请确保当前用户具有访问临时位置所需的权限. 附加信息: - 所有节点上的框架设置检查都失败 -原因: 问题的原因不可用 -操作:用户操作不可用 失败 ...