|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Стек, заданный списком, на Паскале. |
|
Теория - Стек, заданный списком, на Паскале.
|
Старожил Сообщения: 361 |
Профиль | Отправить PM | Цитировать Есть стек, который задаётся списком (т.е. с динамическими переменными, а не через массив).
Т.к. стек действует по принципу LIFO, в нём элементы списка должны записаться в обратном порядке. Вопрос: как вывести стек на экран? (как вывести список - понятно, нужно вывести именно стек) |
|
Отправлено: 20:02, 31-03-2009 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать А вот фигушки - ничего не ответим, пока не покажешь решения Паскаль и NaN!
|
Отправлено: 21:21, 31-03-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 361
|
Профиль | Отправить PM | Цитировать |
Отправлено: 21:36, 31-03-2009 | #3 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата ManHack:
|
|
Отправлено: 12:33, 01-04-2009 | #4 |
Старожил Сообщения: 361
|
Профиль | Отправить 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; Почему? Может я и правда каких-то серьёзных ошибок в этом коде не вижу? Если что, хотелось бы пользоваться только p^.next, а p^.prev не пользоваться ^^ |
|
Отправлено: 15:21, 01-04-2009 | #5 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать ну так действия такие:
вариант 1: 1. загнать всё в массив (задом-наперёд) 2. вывести массив на экран (передом-назад) вариант 2: перевернуть монитор вниз-головой или смириться с ситуацией любым другим образом. Например пусть есть таблица логов. Её можно отрисовать по возрастанию даты, а можно по убыванию - так даже удобней будет. |
Отправлено: 20:59, 01-04-2009 | #6 |
Забанен Сообщения: 463
|
Принципиально не верно стек сделан - последний элемент должен хранить адрес предыдущего т.е. 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
|
Профиль | Отправить PM | Цитировать Если надо исключительно через стек реализовать, то создать второй и перепихать в него результаты - получится обратный порядок. Эффективнее, конечно же, решать задачу не через стек.
Alan85, а если не стирает - это уже не стек |
Отправлено: 23:37, 01-04-2009 | #8 |
Забанен Сообщения: 463
|
Не ну одно дело вывести содержимое (посмотреть) а другое выкинуть его весь.. а вообще я бы все переписал с нуля - реально не уютно этим кодом пользоваться- интуиция. Да и процедуру push тоже надо переписать если идти от конца к началу.
|
Отправлено: 07:52, 02-04-2009 | #9 |
Старожил Сообщения: 361
|
Профиль | Отправить PM | Цитировать А как идти от конца к началу?
|
Отправлено: 23:48, 07-04-2009 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|