如何求入栈顺序为1234……N的序列的所有可能的出栈序列?

zjm84812 2003-12-29 04:49:08
递归?用树?
...全文
2344 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaalife 2004-01-04
  • 打赏
  • 举报
回复
heihei

不知道

morris 2004-01-03
  • 打赏
  • 举报
回复
也就是2C(2n,n)/(n+1)

快快给分啊
morris 2004-01-03
  • 打赏
  • 举报
回复
N的catalan数
查查组合数学的书
孩皮妞野 2004-01-03
  • 打赏
  • 举报
回复
就是N的全排列吧。

用回溯法打印N的全排列就得到了本问题的等价解。
zjm84812 2004-01-03
  • 打赏
  • 举报
回复
aaalife(小神),你的热情我领了,不过你不会连木下藤吉郎都不知道把?
aaalife 2004-01-03
  • 打赏
  • 举报
回复
楼主好像一直没来哎~~~~~~~~~~~~









抵制日货~~!!



^_^
aaalife 2004-01-03
  • 打赏
  • 举报
回复
void stackseq(stack *input, stack *s, stack *output) {
/* 来自考研网严蔚敏老师的解法*/
if(stackempty(input) && stackempty(s)) outputstack(output);
else {
if(!stackempty(input)) {
push(s, pop(input));
stackseq(input, s, output);
push(input, pop(s));
}
if(!stackempty(s)) {
push(output, pop(s));
stackseq(input, s, output);
push(s, pop(output));
}
}
}

aaalife 2004-01-03
  • 打赏
  • 举报
回复
啊啊啊

我给的网址里面不是有源程序吗??????????????????????????
???????????????????????????????、
算了
还是我给你们贴出来吧~~~~~~~~~~

#include <stdio.h>

typedef struct {
int *stk;
int top;
int size;
} stack;

void initstack(stack *s, int n) {
s->stk = (int*)malloc((s->size=n) * sizeof(int));
s->top = 0;
}

void copystack(stack *ss, stack *s) {
int i;
if(ss->stk) free(ss->stk);
ss->stk = (int*)malloc((ss->size=s->size) * sizeof(int));
ss->top = s->top;
for(i=s->top-1; i>=0; i--) ss->stk[i] = s->stk[i];
}

void outputstack(stack* s) {
int i;
for(i=0; i<s->top; i++) printf("%d ", s->stk[i]);
printf("\n");
}

int stackempty(stack* s) {
return !s->top;
}

void push(stack* s, int x) {
s->stk[s->top++] = x;
}

int pop(stack* s) {
return s->stk[--s->top];
}

void stackseq(stack *input, stack *s, stack *output) {
/*初始状态:栈input中存放要输入的元素,s, output为空
结束状态:input 和 s 均为空 */

stack ii, ss, oo;
if(stackempty(input)) { /*如果数据已经全部输入完毕*/
if(stackempty(s)) outputstack(output); /*而且栈中也没有剩余,则输出序列*/
else {
push(output, pop(s)); /*栈中元素进入输出序列*/
stackseq(input, s, output); /*重新调度*/
}
}
else { /*还有元素要输入*/
if(!stackempty(s)) { /*我们需要保存现有状态*/
initstack(&ii, 1); copystack(&ii, input);
initstack(&ss, 1); copystack(&ss, s);
initstack(&oo, 1); copystack(&oo, output);
push(&oo, pop(&ss));
stackseq(&ii, &ss, &oo);
}
push(s, pop(input)); /*再输入一个元素*/
stackseq(input, s, output);
}
}

void main() {
int i;
stack input, s, output;
initstack(&input, 20);
initstack(&s, 20);
initstack(&output, 20);

for(i=3; i>0; i--) push(&input, i);

stackseq(&input, &s, &output);
}


========================================

12s 2004-01-02
  • 打赏
  • 举报
回复 3
基本算法如下:
#define N 5
i=0;
当i<N时循环
将前i个数压入栈;
释放栈中所有的数;
j从i+1到N循环 执行
输出剩余的数;
i++;
12s 2004-01-02
  • 打赏
  • 举报
回复
楼主可能是个日本人,中文不明白,所以没有理解到大家的意思哦!!
不知道有没源程序?
aaalife 2003-12-30
  • 打赏
  • 举报
回复
如果入栈是1...n出战只能是n..1啊

楼主考虑的太简单啦~~~~

如果 1 已经入栈,此时 2 还未入栈,这时我们可以 让 2 入栈,也可以先让 1 出栈,再让 2 入栈,以后依次类推-------

注意的是 不是要 N 个数全都入栈后才可以执行出栈操作的,随时都是可以进行出栈的。


来这里看看
http://expert.csdn.net/Expert/topic/2351/2351525.xml?temp=.1929743





楼主,你的名字咋像日本人的??!!! 偶觉得十分di不爽~~~~寒!!!


o1n 2003-12-29
  • 打赏
  • 举报
回复
递归。
dengsf 2003-12-29
  • 打赏
  • 举报
回复
对 1-n 的入栈序列。

若 1 排在出栈序列的第 i 位,
则 它之前出栈的必是 2-i,
而 i+1 ~ n 则必在 1 之后出栈。

这样 2~i 和 i+1 ~ n 也自成一个 入栈-出栈 对,但长度比 1-n 的要少。
递归如上。
LeeMaRS 2003-12-29
  • 打赏
  • 举报
回复
只需要递归就可以了.
NowCan 2003-12-29
  • 打赏
  • 举报
回复
不是一次全部进占,而是分批的。
比如,用<-表示进占,->表示出站
1<-
2<-
2->
3<-
3->
1->
...
如此,明白了?
BinaryTreeEx 2003-12-29
  • 打赏
  • 举报
回复
这个题目我看过几次了,就是不明白出战的所有可能序列。如果入栈是1...n出战只能是n..1啊。烦请楼主指教一下。

33,029

社区成员

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

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