社区
数据结构与算法
帖子详情
一道关于栈的问题
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
...全文
152
11
打赏
收藏
一道关于栈的问题
编号分别为1,2,……,n的n辆列车顺序进入一个栈式结构的站台。试给出这n辆列车开出车站的所有可能次序。例如编号为1,2,3,4的4辆列车按照push,push,pop,push,push,pop,pop,pop操作,可使得开出车站的次序为2,4,3,1
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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.
记住,是顺序进,而不是连续进
单调
栈
详解
定义: 单调
栈
,顾名思义就是
栈
内元素单调按照...下面我们通过简单介绍单调减
栈
和单调增
栈
问题
来进一步说明使用单调
栈
处理
问题
的过程。 单调
栈
主要解决以下
问题
: 寻找下一个更大元素 寻找前一个更大元素 寻找.
栈
的
问题
,
栈
模拟
问题
:现在有n个元素分别是1,2,3,...,n,我们想知道通过一个
栈
,在n次push/pop后,出
栈
序列可能是什么样的。例如n是5,那么入
栈
次序就是1,2,3,4,5,如果我们希望出
栈
次序同样是1,2,3,4,5,那只要每push一个数,就...
一道
栈
的输入输出序列
问题
一个
栈
输入序列为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、若是单调递增
栈
,则从
栈
顶到
栈
底的元素是严格递增的。若是单调递减
栈
,则从
栈
顶到
栈
底的元素是严格递减的。 2、越靠近
栈
顶...
数据结构与算法
33,028
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章