Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Стеки


Автор: Gromila 17.5.2006, 17:16
Задание : 

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

--------------------------------------------------------

Создание стека я сделал.

Подскажите как слить 2 стека в один ?  



Код


Program STACK;
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.


  

Автор: _hunter 17.5.2006, 17:27
тупо взять второй стек и все элементы из него положить в первый 

Автор: Alexeis 17.5.2006, 17:27
Gromila, Вообще в Delpi есть уже класс стека
TStack; (uses Contnrs)
А в каком порядке элементы надо сливать в один? 

Автор: Snowy 17.5.2006, 17:28
Нужно найти последний элемент первого стека и в его next прописать второй стек. 

Автор: drkot 17.5.2006, 17:45
Я бы поступил так:
  Сделал функции
        PUSHStack(_Stack: PStack; _Elem:TElem):TError;
        POPStack(_Stack: PStack; VAR _Elem:TElem):TError;
 
Алгоритм:
   Наполнил первый стек;
   Наполнил второй стек;
   Выбираеш значения из первого стека и заталкиваеш во второй (или наоборот)
   Выбираеш значения из второго стека и выводиш на экран.

   В кодовом варианте у тебя все реализовано.

Вот и все.  Учись студент.      

Автор: Yanis 17.5.2006, 17:56
Здаётся мне, что это студент. Не стоит предлагать, нужно написать smile 

Автор: drkot 17.5.2006, 17:59
Цитата(Yanis @  17.5.2006,  17:56 Найти цитируемый пост)
 нужно написать

Написать то можно, тока ему пользы не будет.  smile 

Yanis, 
а придет к тебе такой программист даш ему задание а он по форумам будет исходники просить. Некузяво получится.  

Автор: Gromila 17.5.2006, 18:18
Ну вообще то я не на программера учусь, это у меня как проходной этап, т.е. мне главное работу сдать.

Хотя программирование нравится smile 

Вот так прога должна выглядить ?

Код

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.
 

Автор: Yanis 17.5.2006, 18:21
Цитата(Gromila @  17.5.2006,  19:18 Найти цитируемый пост)
это у меня как проходной этап

Понимаю.
 smile Я бы сам с радостью "пропустил" некоторые этапы smile  

Автор: drkot 17.5.2006, 18:54
Цитата(Gromila @  17.5.2006,  18:18 Найти цитируемый пост)
Вот так прога должна выглядить ?

Работает? Значит может и так выглядеть.
Но при написании кода надо стремиться к "красоте" ибо красивый алгоритм работает сам посебе, а некрасивый ...
К примеру: а если понадобится 6 елементов в стек добавить или 4, что отдельные процедуры ввода писать будеш.
Лучше в процедуры закладывать элементарные логически завершенные действия, а не целый алгоритм (две меленьких лычше одной большой).
 

Автор: Gromila 17.5.2006, 19:26
drkot  smile   ты это моему однокурснику скажи, вот ему точно на программирование надо было идти, он в прогах всё почти хочет предусмотреть, поэтому даже самые маленькие задачки занимают в 2 раза больше кода чем  у всех остальных.

А мне главное чтобы работало smile  

Автор: drkot 17.5.2006, 19:35
Цитата(Gromila @  17.5.2006,  19:26 Найти цитируемый пост)
А мне главное чтобы работало

Согласен. Но это до первой тысячи строк. А когда звонят и говорят "5 лет назад вы нам программу писали .... надо изменения внести" вот тогда радуешся что все предусмотрел

Сори за  smile  уже нев тему. 

Автор: Gromila 17.5.2006, 19:50
 smile   Ок, согласен, прекращаем оффтопить. smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)