const max=40;
type
elem=integer;
stack=record
mytop:integer;
items:array[0..max-1] of elem;
end;
function empty(s:stack):boolean;
begin
if s.mytop=-1 then
empty:=true
else
empty:=false
end;
function full(s:stack):boolean;
begin
if s.mytop=max-1 then
full:=true
else
full:=false;
end;
procedure clear(var s:stack);
begin
s.mytop:=-1;
end;
procedure push(var s:stack;x:elem);
begin
s.mytop:=s.mytop+1;
s.items[s.mytop]:=x;
end;
procedure pop(var s:stack;var x:elem);
begin
x:=s.items[s.mytop];
s.items[s.mytop]:=0;
s.mytop:=s.mytop-1;
end;
procedure scopy(s1:stack;s2:stack;s3:stack;tn:integer);
var t,i:integer;
begin
writeln;
for i:=1 to tn do
begin
t:=0;
if not empty(s1) then
pop(s1,t);
write('s1 :');
write(t,',');
end;
writeln;
for i:=1 to tn do
begin
t:=0;
if not empty(s2) then
pop(s2,t);
write('s2 :');
write(t,',');
end;
writeln;
for i:=1 to tn do
begin
t:=0;
if not empty(s3) then
pop(s3,t);
write('s3 :');
write(t,',');
end;
writeln;
writeln('*********');
end;
procedure tower(topn:integer;var s1:stack;var s2:stack;var s3:stack;src:char;aux:char;dest:char);
var t:integer;
begin
if topn=1 then
begin
writeln;
write('Disk 1 from ',src,' to ',dest);
pop(s1,t);
push(s3,t);
end
else begin
tower(topn-1,s1,s3,s2,src,dest,aux);
writeln;
write('Disk ',topn,' from ',src,' to ',dest);
pop(s1,t);
push(s3,t);
tower(topn-1,s2,s1,s3,aux,src,dest);
end;
end;
var
a:array[1..8,1..8] of integer;
i,j,n1,fl,n2,n3,n4:integer;
c:char;
st1:string;
s1,s2,s3:stack;
begin
clear(s1);
clear(s2);
clear(s3);
write('Enter Num of the disks :');
readln(i);
for j:=i downto 1 do
push(s1,j);
tower(i,s1,s2,s3,'A','B','C');
readln;
end.