社区
数据结构与算法
帖子详情
一道关于栈的问题
hyBegins
2005-03-20 02:47:13
编号分别为1,2,……,n的n辆列车顺序进入一个栈式结构的站台。试给出这n辆列车开出车站的所有可能次序。例如编号为1,2,3,4的4辆列车按照push,push,pop,push,push,pop,pop,pop操作,可使得开出车站的次序为2,4,3,1
...全文
144
11
打赏
收藏
一道关于栈的问题
编号分别为1,2,……,n的n辆列车顺序进入一个栈式结构的站台。试给出这n辆列车开出车站的所有可能次序。例如编号为1,2,3,4的4辆列车按照push,push,pop,push,push,pop,pop,pop操作,可使得开出车站的次序为2,4,3,1
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Riemann
2005-03-23
打赏
举报
回复
楼上的弄错了,应该是C(2n,n)-C(2n,n-1)=C(2n,n)/(n+1).
minlingtianxia
2005-03-23
打赏
举报
回复
'an=C(2n,n)-C(2n,2n-1)=C(2n,n)/(n+1)'
有没有人把这个公式给推导一下?谢谢
kamimail
2005-03-21
打赏
举报
回复
每递归一次将当前结果存入链表中,到最后在从链表中取出结果
hyBegins
2005-03-21
打赏
举报
回复
我自己也从网上找了些资料,但只找到下面这个公式,具体怎么用程序输出每种可能的序列的算法,找不到。不知哪位能帮忙!
关于计数问题:即列车出站的顺序有多少种可能(记做an)?
n=1, an= 1
n=2, an= 2
n=3, an= 5
n=4, an=14
...... ......
an的通解an=C(2n,n)-C(2n,2n-1)=C(2n,n)/(n+1)
hyBegins
2005-03-21
打赏
举报
回复
晕啊,能给个详细点的算法吗?不要源程序呀
mmmcd
2005-03-21
打赏
举报
回复
输出每种可能的序列的算法就是用回溯法。
“栈顶元素有两个选择,要么出,要么不出”
这类问题提过n次(n>=5)
有时间看看这个:
http://acm.zju.edu.cn/show_problem.php?pid=1004
kamimail
2005-03-20
打赏
举报
回复
代码可能不简洁请指正啊
kamimail
2005-03-20
打赏
举报
回复
一个简单实现,思路见注释,我也是初学,请大家批评指正
// STack.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "STack.h"
#include <stack>
#include <list>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
//stack<int> plat;
int plsz=4;
//假设车站停位与车数一致
void Func(int num,stack<int> plat1,list<int> rsltset1)//处理当前编号为num 的车辆,栈顶元素有两个选择,要么出,要么不出
{
stack<int> plat(plat1);
list<int> rsltset(rsltset1);
if( num<plsz )
{
for(int i=0;i<2;i++)
{
if(i==0)
{
plat.push(num);//当前车入库
rsltset.push_back(plat.top());//出站
plat.pop();
Func(num+1,plat,rsltset);
rsltset.pop_back();
}
//当前栈顶选择不初,则处理下一辆车
else
{
plat.push(num);
//plat.push(num+1);
Func(num+1,plat,rsltset);
}
}
}
if(num==plsz) //如果当前车号为车库编号总数
{
plat.push(num);
while(!plat.empty())//剩余车辆存入结果集中
{
rsltset.push_back(plat.top());
plat.pop();
}
list<int>::iterator itr=rsltset.begin();
for(;itr!=rsltset.end();itr++)
{
cout<<(*itr)<<" ";
}
cout<<endl;
}
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("致命错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
stack<int> plat;list<int> rsltset;
Func(1,plat,rsltset);
int k;
cin>>k;
}
return nRetCode;
}
mmmcd
2005-03-20
打赏
举报
回复
#include <iostream.h>
int stk[21],out[21];
void go(int n,int intop,int outtop,int in)
{
if(intop==0 && outtop==n)
{
for(int i=0;i<n;i++)
cout<<out[i]<<' ';
cout<<endl;
return;
}
if(intop<n && in<n)
{
stk[intop]=in+1;
go(n,intop+1,outtop,in+1);
}
if(intop>0)
{
out[outtop]=stk[intop-1];
int t=stk[intop-1];
go(n,intop-1,outtop+1,in);
stk[intop-1]=t;
}
}
int main()
{
int n;
while(cin>>n && n<21)
go(n,0,0,0);
return 0;
}
zengwujun
2005-03-20
打赏
举报
回复
例子:进1234
那么,所有出现312,412,413,423的序列都是不可能出现的
zengwujun
2005-03-20
打赏
举报
回复
这里面只有一条规则
若p,q,r是顺序进栈的三个元素,那么出来的顺序不可能是r,p,q.
记住,是顺序进,而不是连续进
图解数据结构与算法
【为什么学习数据结构与算法】 程序=数据结构+算法。数据结构和算法是程序的基础,没有系统地学习过数据结构和算法的程序员只能称作是coder,知道我们写的代码使用了什么数据结构,它的特征是什么。知道解决某些
问题
是用的何种算法才会从coder晋升为工程师。另外,大厂面试数据结构和算法也是我们绕不过去的一个门槛。这部分恰好又不是突击能够解决的知识储备,所以很有必要系统地学习一下数据结构和算法了【推荐您学习这门课程的原因】1、图解数据结构与算法:拒绝抽象枯燥的学习,本课程采用动画演示的形式,让您在动画中掌握算法的底层原理。下面是课程中几个动画的演示效果: 2、实战2020大厂算法面试题:解析大厂算法面试题,分析其中算法原理,并动手实操,让大家通关面试最后
一道
题。 3、全面、系统化的课程设计:系统化讲解数据结构与算法,让你快速梳理整个算法知识体系,掌握算法的核心思想。 【主讲讲师】 孙玖祥:8年互联网开发经验,3年教学经验; 擅长JAVA技术
栈
、高并发高可用伸缩式微服务架构; 曾多次参与大型银行和互联网公司核心系统的架构设计和开发; 丰富的教学和就业经验,所带毕业学员逾千人,所带班级月内就业率均达98%以上。
栈
的
问题
,
栈
模拟
问题
:现在有n个元素分别是1,2,3,...,n,我们想知道通过一个
栈
,在n次push/pop后,出
栈
序列可能是什么样的。例如n是5,那么入
栈
次序就是1,2,3,4,5,如果我们希望出
栈
次序同样是1,2,3,4,5,那只要每push一个数,就立即pop一个数。如果我们希望出
栈
次序是3,2,4,5,1,那么我们先让1,2,3入
栈
,然后pop出来3和2,接着4入
栈
后马上pop,再就是5入
栈
后马上pop,最后再把
栈
里的1pop出。再例如,如果我们希望出
栈
次序是5,4,1,2,3,这是办不到的,如果要让5最先出
栈
,
单调
栈
详解
定义: 单调
栈
,顾名思义就是
栈
内元素单调按照递增(递减)顺序排列的
栈
。 适用
问题
: 要知道单调
栈
的适用于解决什么样的
问题
,我们首先需要知道单调
栈
的作用。单调
栈
分为单调递增
栈
和单调递减
栈
,通过使用单调
栈
我们可以访问到下一个比他大(小)的元素(或者说可以)。也就是说在队列或数组中,我们需要通过比较前后元素的大小关系来解决
问题
时我们通常使用单调
栈
。下面我们通过简单介绍单调减
栈
和单调增
栈
问题
来进一步说明使用单调
栈
处理
问题
的过程。 单调
栈
主要解决以下
问题
: 寻找下一个更大元素 寻找前一个更大元素 寻找.
从
一道
简单的pwn题 认识
栈
转移
这个题 好像是 bugku的 但是好像这个题 给换了 这个是 64位的程序 这个题 难搞点就是
栈
空间不够 可以看的出来 我们s的地方是 rbp-0x10的地方 那么 返回地址 应该就是 rbp-0x18的地址 如果我们想把这个搞定 那么 要考虑一下
栈
转移
栈
转移 有很多高级的用法 这里 就浅显的说一些简单的
栈
转移
栈
转移 其实就是利用的是这两个...
一道
栈
的输入输出序列
问题
一个
栈
输入序列为1,2,3,4,5,则下列序列中不可能是
栈
的输出序列是( ) A.1 2 3 4 5 B.5 4 3 2 1 C.2 3 4 5 1 D.4 1 2 3 5 分析:可以根据答案来判定的,像A的话,顺序是1 2 3 4 5 那么当1进来的时候应该马上出去,如果不这样做的话,1肯定不是第一个出去的,依此类推。A.1进 1出 2进 2出 3进 3出 4进 4出 5进 5出B...
数据结构与算法
33,010
社区成员
35,327
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章