Помощь - Поиск - Пользователи - Календарь
Полная версия: Стеки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Merlin
Задание :

Создать два стека по 5 элементов. Слить их в один стек. Результирующий стек вывести на экран.

Создание стека я сделал.
Подскажите как слить 2 стека в один ? mega_chok.gif


program STACK_Pr;
type
PStack = ^TStack;
TStack = record
chislo: integer;
next : PStack;
end;
var
x, Stack : PStack;
i : integer;
Procedure INPUT_STACK;
begin
Stack := nil;
for i := 1 to 5 do
begin
New(x);
write ('Введите ', i, ' число '); readln(x^.chislo);
x^.next := Stack; Stack:=x;
end;
end;
Procedure OUTPUT_STACK;
begin
if Stack = nil
then writeln('Стек пуст!')
else begin
x := Stack;
while x<> nil do
begin
write (x^.chislo,' ');
x := x^.next;
end;
end;
end;
begin
INPUT_STACK;
OUTPUT_STACK;
end.
Merlin
blink.gif Расскажите как объединить 2 стека в один ?
volvo
Цитата(Merlin @ 16.05.2006 23:58)
Создать два стека по 5 элементов. Слить их в один стек.

Просто слить? Без сортировки или еще каких приколов?

Тогда так:
Procedure ConcatStack(const s1, s2: PStack);
var p: PStack;
begin
p := s1;
while p ^.next <> nil do p := p^.next;

p^.next := s2; { К хвосту первого стека прицепить второй }
end;

Только вот у тебя проблема - ты 2 разных стека сделать не можешь !!! Потому, что работаешь через глобальные переменные smile.gif Придется менять кое-что smile.gif
Merlin
Volvo спасибо

Да, мне нужно просто соединить 2 стека. А что нужно поменять в программе ?
volvo
Перестать использовать глобальные переменные. Ведь параметры процедур/функций не просто так придумали, правда? Через них ты и должен с процедурами общаться (это - правильный стиль программирования. Иначе побочных эффектов не избежать...)

program STACK_Pr;
type
PStack = ^TStack;
TStack = record
chislo: integer;
next : PStack;
end;

Procedure INPUT_STACK(var stack: pstack);
var
x: pstack;
i: integer;
begin
Stack := nil;
for i := 1 to 5 do
begin
New(x);
write('item #', i:2, ' = '); readln(x^.chislo);
x^.next := Stack;
Stack:=x;
end;
end;

Procedure OUTPUT_STACK(stack: PStack);
var x: PStack;
begin
if Stack = nil
then writeln('<empty>')
else begin
x := Stack;
while x <> nil do begin
write(x^.chislo:4);
x := x^.next;
end;
writeln;
end;
end;

Procedure ConcatStack(const s1, s2: PStack);
var p: PStack;
begin
p := s1;
while p ^.next <> nil do
p := p^.next;

p^.next := s2;
end;

var s1, s2: pstack;
begin
INPUT_STACK(s1);
INPUT_STACK(s2);
output_stack(s1);
output_stack(s2);

concatStack(s1, s2);
OUTPUT_STACK(s1);
end.

Вот такого типа что-то...
Merlin
Спасибо give_rose.gif
Merlin
Цитата
Procedure ConcatStack(const s1, s2: PStack);
var p: PStack;
begin p := s1;
while p ^.next <> nil do p := p^.next;
p^.next := s2;
{ К хвосту первого стека прицепить второй }
end;


Что тут надо изменить, чтобы 2 стек добавлялся не в конец первого стека, а в начало ?
Ведь в стеках вроде можно работать только с верх. стека.
volvo
Так:
Procedure ConcatStack(var s1, s2: PStack);
var p, X: PStack;
begin
p := s1;

while s2 <> nil do begin
New(x);
x^.chislo := s2^.chislo;
x^.next := p;
p := x;

s2 := s2^.next
end;
s1 := p;
end;

?

(учти, это чревато утечками памяти: элементы стека S2 не удаляются... )
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.