|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Стек, заданный списком, на Паскале. |
|
|
Теория - Стек, заданный списком, на Паскале.
|
|
Старожил Сообщения: 361 |
Есть стек, который задаётся списком (т.е. с динамическими переменными, а не через массив).
Т.к. стек действует по принципу 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 | |
|