求教算法,不知道这个难不难

zgy231552 2002-05-17 04:29:39
1,2,3,4,5....n 按顺序进栈,设计一个算法,输出所有可能的出栈可能
...全文
30 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgy231552 2002-05-19
  • 打赏
  • 举报
回复
大家写写看,我回去好好想想.................
pigsanddogs 2002-05-18
  • 打赏
  • 举报
回复
我的思路:
fun(n):以第一个数出践为标识.那有n-1种可能;
它可以尾随2,3...n 出践比如尾随m出践.在操作(出践)它之前,他一直是践底.其余数的操作都不跟他有关.所以有fun(m-1).而之后操作(出践)它以后.践为空了.之后还余下n-m个待排有续数.他的操作方法为fun(n-m).
所以可以分解成 fun(n)=fun(0)*fun(n-1)+fun(1)*fun(n-2)+...+fun(n-1)*fun(0) fun(1)=0并且定义fun(0)=1.
程序实现:
#include <iostream.h>
#include <stdio.h>
#define MAX_NUMBER 3
void push(int n)
{
cout<<"push("<<n<<")";
}
void pop(int n)
{
cout<<"pop("<<n<<")";
}
void fun(int start,int end)
{
for(int i=start;i<=end;i++)
{
push(start);
if(i!=start)
fun(start+1,i);
pop(start);
if(i!=end)
fun(i+1,end);
cout<<endl;
}
}
void main()
{
fun(1,MAX_NUMBER);
}

/*这个递归函数有个bug.我不知道怎么修改.比如fun(1,3)递归成为=push(1),fun(2,3),pop(1).<----其中一个解;
本来因该把fun(2,3)={push(2),pop(2),fun(3,3) },{push(2),fun(2,3),pop(2)},每个分解式都要加入 push(1),pop(1),可以用递归方法我无法展开.只是成为了 push(1),{push(2),pop(2),fun(3,3),{push(2),fun(2,3),pop(2),}pop(1)....欢迎大家指正..!
另外 leopro(六月飞雪) 的思路不错.谁能把算法写出来?
*/


javan 2002-05-18
  • 打赏
  • 举报
回复
我写了个程序,用比较笨的方法,用循环输出。
例如,用数组a[4]={'a','b','c','d'}的下标0,1,2,3来表示进栈顺序。
然后根据栈的特性写出一个符合其特性的表达式。
#include<stdio.h>
void main(void)
{
int i,j,k,l;
char a[4]={'A','B','C','D'};
i=j=k=l=0;
for(;i<4;i++)
{
for(j=0;j<4;j++)
{
if(i!=j)
{
for(k=0;k<4;k++)
{
if(i!=k&&j!=k)
{
for(l=0;l<4;l++)
{
if(l!=i&&l!=j&&l!=k)
{
if((i>k&&j<k)||(j>l&&l>k)) ;
else
{
printf("%c",a[i]);printf(" ");
printf("%c",a[j]);printf(" ");
printf("%c",a[k]);printf(" ");
printf("%c",a[l]);
printf("\n");
}

}
}
}
}
}
}
}
}
zgy231552 2002-05-17
  • 打赏
  • 举报
回复
我看你们都比较轻视这个问题,这个问题的所有可能的出栈可能为:(2n)!/(n+1)!
好像没有一本数据结构书有输出所有的可能序列的算法.
我是这样理解的:每个元素都有两种可能留在堆栈里面或者直接输出.所以可以构造这样一颗二叉树,但是输出的不全,问题就是,在一个元素输出的时候,此时的堆栈也有两种可能....,比较复杂.那位高人写写看 .
huahao0672 2002-05-17
  • 打赏
  • 举报
回复
数据结构的书上这类算法太多了,自已去看一下书吧!
leopro 2002-05-17
  • 打赏
  • 举报
回复
楼上理解错误

设t(i)时刻栈中有k个元素,可能出栈元素个数为m(0<=m<=k)
t(i+1)时刻又进栈一元素,此时栈中元素个数为k-m+1
……

不难
kbsoft 2002-05-17
  • 打赏
  • 举报
回复
如果是按顺序进栈,只能按相反顺序出来
除非你是说有多少种进展可能?

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧