IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Стеки
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


Задание :

Создать два стека по 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.


Сообщение отредактировано: volvo -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


blink.gif Расскажите как объединить 2 стека в один ?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата(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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


Volvo спасибо

Да, мне нужно просто соединить 2 стека. А что нужно поменять в программе ?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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

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.

Вот такого типа что-то...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


Спасибо give_rose.gif


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


Цитата
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 стек добавлялся не в конец первого стека, а в начало ?
Ведь в стеках вроде можно работать только с верх. стека.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Так:
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 не удаляются... )
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 23.10.2017 0:30
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"