I
iknowabc
Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵,继续拜读您的程序
堆栈以abcd顺序入栈,如何求所有合法的出栈序列
您的程序
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TIntegerArr = array [1..4] of Integer;
var
PopedList: TIntegerArr;
Stack: TIntegerArr;
procedure TryDoIt(PopedIndex, UnPushIndex, StackTop: Integer;
Stack: TIntegerArr);
var
i: Integer;
begin
if PopedIndex=5 then
begin
for i:=1 to 4do
Write(Chr(Ord('a')-1+PopedList), ' ');
WriteLn;
Exit
end;
if StackTop>0 then
begin
PopedList[PopedIndex]:=Stack[StackTop];
TryDoIt(PopedIndex+1, UnPushIndex, StackTop-1, Stack)
end;
if UnPushIndex<=4 then
begin
Stack[StackTop+1]:=UnPushIndex;
TryDoIt(PopedIndex, UnPushIndex+1, StackTop+1, Stack)
end;
end;
begin
TryDoIt(1, 1, 0, Stack);
ReadLn
end.
另外,任何结果字符串的子串也是合法串.
呵呵,看了您这段程序,感觉有点糊涂,有些地方不懂,请教!
1)就递归函数TryDoIt函数的几个参数而言,不是很懂:
PopedIndex:已经出栈的链表PopedList的当前位置??
UnPushIndex:待入栈元素 1234->abcd??
Stack:当前进入栈中的元素??
StackTop:栈中的当前位置??
不知道理解是否正确?
2)
if StackTop>0 then
begin
PopedList[PopedIndex]:=Stack[StackTop];
TryDoIt(PopedIndex+1, UnPushIndex, StackTop-1, Stack)
end;
if UnPushIndex<=4 then
begin
Stack[StackTop+1]:=UnPushIndex;
TryDoIt(PopedIndex, UnPushIndex+1, StackTop+1, Stack)
end;
a)这里两处TryDoIt分别是什么情况下递归?有什么作用?
b)呵呵,感觉是只要是Stack中有元素就要Pop出来
Stack中没有元素时,就将待入栈元素加入栈中,然后再Pop,如此反复。
比如:
最初的a入栈出栈,b入栈出栈,c入栈出栈,d入栈出栈,就形成了第一个出栈序列 a,b,c,d
但是后面的a,b,d,c是怎么出现的,呵呵,跟踪了一下程序,stacktop=2时,
stack怎么会是3,4,0,0,而接着PopedList变为1,2,4,4,呵呵,弄不懂了。
呵呵,看不懂这段程序,也就是无法正确理解产生的结果了。
可能我的问题很简单,还是要请LeeChange您耐心给我讲讲了。
又给您带来麻烦,实在不好意思。感谢您的帮助。
堆栈以abcd顺序入栈,如何求所有合法的出栈序列
您的程序
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TIntegerArr = array [1..4] of Integer;
var
PopedList: TIntegerArr;
Stack: TIntegerArr;
procedure TryDoIt(PopedIndex, UnPushIndex, StackTop: Integer;
Stack: TIntegerArr);
var
i: Integer;
begin
if PopedIndex=5 then
begin
for i:=1 to 4do
Write(Chr(Ord('a')-1+PopedList), ' ');
WriteLn;
Exit
end;
if StackTop>0 then
begin
PopedList[PopedIndex]:=Stack[StackTop];
TryDoIt(PopedIndex+1, UnPushIndex, StackTop-1, Stack)
end;
if UnPushIndex<=4 then
begin
Stack[StackTop+1]:=UnPushIndex;
TryDoIt(PopedIndex, UnPushIndex+1, StackTop+1, Stack)
end;
end;
begin
TryDoIt(1, 1, 0, Stack);
ReadLn
end.
另外,任何结果字符串的子串也是合法串.
呵呵,看了您这段程序,感觉有点糊涂,有些地方不懂,请教!
1)就递归函数TryDoIt函数的几个参数而言,不是很懂:
PopedIndex:已经出栈的链表PopedList的当前位置??
UnPushIndex:待入栈元素 1234->abcd??
Stack:当前进入栈中的元素??
StackTop:栈中的当前位置??
不知道理解是否正确?
2)
if StackTop>0 then
begin
PopedList[PopedIndex]:=Stack[StackTop];
TryDoIt(PopedIndex+1, UnPushIndex, StackTop-1, Stack)
end;
if UnPushIndex<=4 then
begin
Stack[StackTop+1]:=UnPushIndex;
TryDoIt(PopedIndex, UnPushIndex+1, StackTop+1, Stack)
end;
a)这里两处TryDoIt分别是什么情况下递归?有什么作用?
b)呵呵,感觉是只要是Stack中有元素就要Pop出来
Stack中没有元素时,就将待入栈元素加入栈中,然后再Pop,如此反复。
比如:
最初的a入栈出栈,b入栈出栈,c入栈出栈,d入栈出栈,就形成了第一个出栈序列 a,b,c,d
但是后面的a,b,d,c是怎么出现的,呵呵,跟踪了一下程序,stacktop=2时,
stack怎么会是3,4,0,0,而接着PopedList变为1,2,4,4,呵呵,弄不懂了。
呵呵,看不懂这段程序,也就是无法正确理解产生的结果了。
可能我的问题很简单,还是要请LeeChange您耐心给我讲讲了。
又给您带来麻烦,实在不好意思。感谢您的帮助。