Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Стек, заданный списком, на Паскале.

Ответить
Настройки темы
Теория - Стек, заданный списком, на Паскале.

Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Есть стек, который задаётся списком (т.е. с динамическими переменными, а не через массив).
Т.к. стек действует по принципу LIFO, в нём элементы списка должны записаться в обратном порядке.
Вопрос: как вывести стек на экран? (как вывести список - понятно, нужно вывести именно стек)

Отправлено: 20:02, 31-03-2009

 

Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


А вот фигушки - ничего не ответим, пока не покажешь решения Паскаль и NaN!

Отправлено: 21:21, 31-03-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать



Отправлено: 21:36, 31-03-2009 | #3

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата ManHack:
нужно вывести именно стек »
В чём отличие при выводе стека и списка?

Отправлено: 12:33, 01-04-2009 | #4


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Список выводит элементы попорядку, а стек - в обратном порядке.

Код: Выделить весь код
type
	tData = integer;
   tPtr  = ^tNode;
   tNode = record
   	data: tData;
      next: tPtr;
   end;
   tStack = record
   	first, last: tPtr;
   end;

var
   S: tStack;
   D: tData;


function NotEmpty (var S: tStack): boolean; {проверка стека на пустоту}
begin
   NotEmpty := S.First <> nil;
end;

procedure Build (var S: tStack; D: tData); {первоначальное заполнение стека}
var
   f: text;
   p: tPtr;
begin
   assign (f,'stack.txt');
   reset (f);
   S.First := nil;
   S.Last := nil;
   while not eof(f) do begin
      New(p);
      readln (f, D);
      p^.data := D;
      if S.First = nil then
      	S.First := p
      else
      	S.Last^.next := p;
      S.Last := p;
   end;
   close(f);
end;

procedure Push (var S: tStack; D: tData); {добавить элемент}
var
	p: tPtr;
begin
	write ('Item = ');
   readln (D);
   New(p);
   p^.data := D;
   S.Last^.next := p;
   D := 0;
end;

procedure Pop (var S: tStack; var D: tData); {изъять элемент}
var
	p: tPtr;
begin
	if NotEmpty(S) then begin
   	D := S.Last^.data;
      p^ := S.Last^;
      S.Last := S.Last^.next;
      p^.next := nil;
     { Dispose(p); }
   end;
end;

procedure Clear;
begin
end;

procedure Echo (S: tStack); {вывод стека на экран}
var
	p: tPtr;
begin
   {p^ := S.Last^;}
   while S.Last <> nil do begin
      Pop (S, D);
   	writeln (D);
      Echo (S);
   end;

end;
В данном случае ECHO возвращает последний элемент стека и два нолика.
Почему?
Может я и правда каких-то серьёзных ошибок в этом коде не вижу?
Если что, хотелось бы пользоваться только p^.next, а p^.prev не пользоваться ^^

Отправлено: 15:21, 01-04-2009 | #5

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


ну так действия такие:
вариант 1:
1. загнать всё в массив (задом-наперёд)
2. вывести массив на экран (передом-назад)
вариант 2:
перевернуть монитор вниз-головой или смириться с ситуацией любым другим образом. Например пусть есть таблица логов. Её можно отрисовать по возрастанию даты, а можно по убыванию - так даже удобней будет.

Отправлено: 20:59, 01-04-2009 | #6


Аватара для Alan85

Забанен


Сообщения: 463
Благодарности: 91

Профиль | Цитировать


Принципиально не верно стек сделан - последний элемент должен хранить адрес предыдущего т.е. 1<-2<-3<-4... а тут 1->2->3->4. Поэтому после выдавливания последнего элемента указатель last теряется... - адреса 3 элемента не найдет (если только перебором от 1 до 3).
Вот как подправил я:
Код: Выделить весь код
procedure Build (var S: tStack; D: tData); {первоначальное заполнение стека}
var
   f: text;
   p: tPtr;
begin
   assign (f,'stack.txt');
   reset (f);
   S.First := nil;
   S.Last := nil;
   while not eof(f) do begin
      New(p);
      readln (f, D);
      p^.data := D;
      if S.First = nil then begin
      	S.First := p; s.last:=p  end
      else
      begin
       p^.next := s.last;
       S.Last := p;
      end;
   end;

   close(f);
end;

procedure Echo (var S: tStack); {вывод стека на экран}
var
	p: tPtr;
begin
   {p^ := S.Last^;}
   while S.last <> s.first do begin
      Pop (S, D);
      write (D,' ');
  //    Echo (S);
   end;
 Pop (S, D);
 write (D,' ');
end;
Но это стирает стек - полностью его выталкивает, поэтому для отображения не верно все же

Отправлено: 21:44, 01-04-2009 | #7


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Если надо исключительно через стек реализовать, то создать второй и перепихать в него результаты - получится обратный порядок. Эффективнее, конечно же, решать задачу не через стек.

Alan85, а если не стирает - это уже не стек

Отправлено: 23:37, 01-04-2009 | #8


Аватара для Alan85

Забанен


Сообщения: 463
Благодарности: 91

Профиль | Цитировать


Не ну одно дело вывести содержимое (посмотреть) а другое выкинуть его весь.. а вообще я бы все переписал с нуля - реально не уютно этим кодом пользоваться- интуиция. Да и процедуру push тоже надо переписать если идти от конца к началу.

Отправлено: 07:52, 02-04-2009 | #9


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


А как идти от конца к началу?

Отправлено: 23:48, 07-04-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Стек, заданный списком, на Паскале.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Класс стек и очередь на с++ aina Программирование и базы данных 8 30-12-2009 07:54
Как автоматически отправить eMail на заданный адрес Vagac AutoIt 9 30-08-2009 22:16
Стек драйверов как узнать? Ursus Spelaeus Программирование в *nix 1 05-08-2008 19:03
Не доступен заданный узел Ment69 Microsoft Windows NT/2000/2003 2 20-06-2008 21:38
Мобильник с чёрным списком Sergius Мобильные ОС, смартфоны и планшеты 6 12-02-2003 10:22




 
Переход