Стек, заданный списком, на Паскале.
Есть стек, который задаётся списком (т.е. с динамическими переменными, а не через массив).
Т.к. стек действует по принципу LIFO, в нём элементы списка должны записаться в обратном порядке. Вопрос: как вывести стек на экран? (как вывести список - понятно, нужно вывести именно стек) |
А вот фигушки - ничего не ответим, пока не покажешь решения Паскаль и NaN! :tongue:
|
|
Цитата:
|
Список выводит элементы попорядку, а стек - в обратном порядке.
Код:
type Почему? Может я и правда каких-то серьёзных ошибок в этом коде не вижу? Если что, хотелось бы пользоваться только p^.next, а p^.prev не пользоваться ^^ |
ну так действия такие:
вариант 1: 1. загнать всё в массив (задом-наперёд) 2. вывести массив на экран (передом-назад) вариант 2: перевернуть монитор вниз-головой или смириться с ситуацией любым другим образом. Например пусть есть таблица логов. Её можно отрисовать по возрастанию даты, а можно по убыванию - так даже удобней будет. |
Принципиально не верно стек сделан - последний элемент должен хранить адрес предыдущего т.е. 1<-2<-3<-4... а тут 1->2->3->4. Поэтому после выдавливания последнего элемента указатель last теряется... - адреса 3 элемента не найдет (если только перебором от 1 до 3).
Вот как подправил я: Код:
procedure Build (var S: tStack; D: tData); {первоначальное заполнение стека} |
Если надо исключительно через стек реализовать, то создать второй и перепихать в него результаты - получится обратный порядок. Эффективнее, конечно же, решать задачу не через стек.
Alan85, а если не стирает - это уже не стек ;) |
Не ну одно дело вывести содержимое (посмотреть) а другое выкинуть его весь.. а вообще я бы все переписал с нуля - реально не уютно этим кодом пользоваться- интуиция. Да и процедуру push тоже надо переписать если идти от конца к началу.
|
А как идти от конца к началу?
|
Время: 10:22. |
Время: 10:22.
© OSzone.net 2001-