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

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

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

 
 Ответить  Открыть новую тему 
> Стеки
Merlin
сообщение 16.05.2006 23:58
Сообщение #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 - 3.11.2006 22:03


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


Пионер
**

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

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


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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.05.2006 17:28
Сообщение #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
 К началу страницы 
+ Ответить 
Merlin
сообщение 17.05.2006 18:05
Сообщение #4


Пионер
**

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

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


Volvo спасибо

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.05.2006 18:08
Сообщение #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.

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


Пионер
**

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

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


Спасибо give_rose.gif


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Merlin
сообщение 24.05.2006 20:38
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.05.2006 23:11
Сообщение #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

 

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