Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2011, 11:57   #1
Dower
Пользователь
 
Регистрация: 09.03.2009
Сообщений: 20
По умолчанию Turbo Pascal Стек

Помогите разобраться с задачей.

Дан указатель P1 на вершину стека (если стек пуст, то P1=NIL). Извлеч из стека все элементы и вывести их значения. Вывести также количество известных элементов N (для пустого стека вывести 0). после извлечения элементов из стека освобождать память которую они занимали.

Вот есть код
Код:
uses crt;
type PSTRC=^Strc;
     Strc=record
     inf:integer;
     ptr:Pstrc;
end;
var S1,s2:PSTRC;
    i,k,g,p:integer;
    err:boolean;
    a:array [1..20] of integer;
Procedure Dop(var S:Pstrc;dat:integer);
var nov:Pstrc;
begin
New(nov);
nov^.inf:=dat;
nov^.Ptr:=s;
S:=nov;
end;
Function Ud(var S:Pstrc; var err:boolean):integer;
var old:Pstrc;
begin
 if s<>Nil then
  begin
   old:=S;
   S:=S^.ptr;
   Ud:=old^.inf;
   dispose(old);
   err:=false
  end
 else
  begin
   Ud:=0;
   err:=true
  end
end;
Function Cht(s:PSTRC; var err:boolean):integer;
begin
if s<>Nil then
 begin
  write('inf=',s^.inf:3);
  err:=false;
  Cht:=s^.inf;
 end
else begin
      writeln('stack pust');
      err:=True;
      cht:=0;
     end;
end;
BEGIN
 clrscr;
 i:=1;
 k:=1;
 while k<>0 do
  begin
   readln(k);
   Dop(s1,k);
  end;
 while s1<>Nil do
  begin
   a[i]:=Ud(s1,err);
   inc(i);
  end;
 for k:=i downto 1 do
  dop(s2,a[k]);
 for k:=1 to i do
  writeln(ud(s2,err));
readln;
END.
Не могли бы вы проверить правильность его работы, а то почему то в конце при любом раскладе 0 выводится. И если не трудно хотя бы в общих чертах объясните код.
Dower вне форума Ответить с цитированием
Старый 16.04.2011, 12:49   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Код:
type
 pnode=^node;
  node=record
    num:integer;
    next:pnode;
    ch : char;
  end;

var ver, t1 : pnode;

procedure stackout(var anum : integer); // вытащить из стека
begin
if ver<>nil  // если верхушка есть
  then begin
  anum := ver^.num;  // то вернуть её номер
  t1 := ver;         // временный узел
  ver := ver^.next;  // текущий узел задать как следующий
  dispose(t1);       // очистить узел
  end
  else showmessage('стек пустой!');
end;


procedure stackin( anum : integer; ach:char); // складывание в стек
begin
if ver=nil                  // если верхушки стека нет
  then begin                // то завести её и задать параметры
  new(ver);
  ver^.next := nil;
  ver^.ch := ach;
  ver^.num := anum;
  end
  else begin                // иначе новые данные записать в новый узел
  new(t1);
  t1^.ch := ach;
  t1^.num := anum;
  t1^.next := ver;      // нынешнюю вершину стека сделать след узлом для созданного
  ver := t1;               // и задать указатель верхушки на созданый узел
  end;
end;
там в стеке кроме номера есть ещё и символ, но можно просто удалить все обращения к нему

сам напишешь вызов данных подпрограмм ? а то у меня в коде они не посредственно не делают заполнение и очистку всего стека, а вызываются по мере необходимости
phomm вне форума Ответить с цитированием
Старый 16.04.2011, 13:29   #3
Dower
Пользователь
 
Регистрация: 09.03.2009
Сообщений: 20
По умолчанию

Спасибо за код.
Хорошо бы если бы вы смогли написать и вызов этих процедур, а то я в программировании не очень понимаю.
Dower вне форума Ответить с цитированием
Старый 17.04.2011, 10:28   #4
Dower
Пользователь
 
Регистрация: 09.03.2009
Сообщений: 20
По умолчанию

АП____________
Dower вне форума Ответить с цитированием
Старый 18.04.2011, 17:01   #5
Dower
Пользователь
 
Регистрация: 09.03.2009
Сообщений: 20
По умолчанию

phomm или кто ни будь, кто понимает, помогите дописать пожалуйста программку.
Dower вне форума Ответить с цитированием
Старый 19.04.2011, 12:55   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

ну как же по комментариям-то не дойти ?? Ведь не могли же Вам задать задание такое , что Вы не проходили ! Вы должны уже быть в теме ! мало времени значит уделили Вы развитию своего понимания...

вызывается примерно так :
Код:
const stacksize = 20
...
var i, tmp : integer;
...
for i := 1 to stacksize
  do stackin(i); // подразумевается, что работу с символом убрали
// теперь в стеке 20 элементов
...
for i := 1 to stacksize
  do begin
  stackout(tmp);
  writeln(tmp); // вывод стека, естественно, цифры пойдут в обратном порядке
  end;
вообще можно сделать извлечение функцией, а не процедурой, но это не особо на что-то влияет
phomm вне форума Ответить с цитированием
Старый 19.04.2011, 19:06   #7
Dower
Пользователь
 
Регистрация: 09.03.2009
Сообщений: 20
По умолчанию

Добавил к первому коду вашу концовку но почему то не работает.
Dower вне форума Ответить с цитированием
Старый 21.04.2011, 12:18   #8
Dower
Пользователь
 
Регистрация: 09.03.2009
Сообщений: 20
По умолчанию

Может я что не так сделал?
Dower вне форума Ответить с цитированием
Старый 22.04.2011, 18:34   #9
Dower
Пользователь
 
Регистрация: 09.03.2009
Сообщений: 20
По умолчанию

Помогите доделать програмку, а то ни как не получается.
Dower вне форума Ответить с цитированием
Старый 26.04.2011, 09:25   #10
Dower
Пользователь
 
Регистрация: 09.03.2009
Сообщений: 20
По умолчанию

Разобрался с программкой теперь все работает. Вот код
Код:
uses crt;
type PSTRC=^Strc;
     Strc=record
     inf:integer;
     ptr:Pstrc;
end;
var S1,s2:PSTRC;
    i,k,g,p:integer;
    err:boolean;
    a:array [1..20] of integer;
Procedure Dop(var S:Pstrc;dat:integer);
var nov:Pstrc;
begin
New(nov);
nov^.inf:=dat;
nov^.Ptr:=s;
S:=nov;
end;
Function Ud(var S:Pstrc; var err:boolean):integer;
var old:Pstrc;
begin
 if s<>Nil then
  begin
   old:=S;
   S:=S^.ptr;
   Ud:=old^.inf;
   dispose(old);
   err:=false
  end
 else
  begin
   Ud:=0;
   err:=true
  end
end;
Function Cht(s:PSTRC; var err:boolean):integer;
begin
if s<>Nil then
 begin
  write('inf=',s^.inf:3);
  err:=false;
  Cht:=s^.inf;
 end
else begin
      writeln('stack pust');
      err:=True;
      cht:=0;
     end;
end;
BEGIN
 clrscr;
 i:=0;
 k:=1;
 while k<>0 do
  begin
   readln(k);
   Dop(s1,k);
  end;
  writeln;
 while s1<>Nil do
  begin
   a[i]:=Ud(s1,err);
   inc(i);
  end;
 for k:=i downto 1 do
  dop(s2,a[k]);
 for k:=1 to i do
  writeln(ud(s2,err));
  writeln;
  writeln(i);
readln;
END.
Но здесь используется массив и второй стек (s2). Помогите исправить код так чтобы работало без применения массива и второго стека.
Dower вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Turbo Pascal 7.0 @vror@ Помощь студентам 2 05.05.2010 16:58
Turbo Pascal or Pascal ABC Ikram Паскаль, Turbo Pascal, PascalABC.NET 0 27.04.2010 13:44
Turbo Pascal glavad Помощь студентам 4 16.12.2009 12:36
а free pascal не читает задачи которые написаны на turbo pascal? demonara Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 16:28
Pascal Множества, стек, списки, очередь. RrR5 Помощь студентам 4 26.01.2009 15:00