Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_voprosy_k_ekzamenu_po_AiSD.docx
Скачиваний:
42
Добавлен:
29.04.2019
Размер:
417.06 Кб
Скачать

11. Реализация стеков с помощью (односвязных) списков

Любой односвязный список может рассматриваться в виде стека. Однако список по сравнению со стеком в виде одномерного массива имеет преимущества, так как заранее не эадан его размер.

Стековые операции, применимые к спискам.

1). Чтобы добавить элемент в стек, надо в алгоритме вставки в начало списка заменить указатель Lst на указатель S (операция Push(S, x)).

P = GetNode

Info(P) = x

Ptr(P) = S

S = P

return

2). Проверка стека на пустоту (Empty (S))

if S = Nil

then print “Стек пуст

Stop

endif

return

3) Выборка элемента из стека (POP(S))

Empty(S)

P = S

X = Info(P)

S = Ptr(P)

FreeNode(P)

return

12. Смысл и организация операций создания и удаления элемента динамической структуры. Понятие свободного списка и пула свободных эл-ов. Ути­лизация освободившихся элементов

Для более эффективного использования памяти компью­тера (для исключения мусора, то есть неиспользуемых эле­ментов) при работе его со списками создается свободный список, имеющий тот же формат полей, что и у функцио­нальных списков.

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

Количество элементов в свободном списке должно быть определено задачей, которую решает программа. Как правило, свободный список создается в памяти машины как стек, При этом создание (GetNode) нового элемента эквивалент» выборке элемента свободного стека, а операция FreeNode добавлению в свободный стек освободившегося элемента.

Пусть нам необходимо создать пустой список по тип; стека (рис. 3.6) с указателем начала списка - AVAIL. Разработаем процедуры, которые позволят нам создавать пусто элемент списка и освобождать элемент из списка.

AVAIL

Операция GetNode

Разработаем процедуру, которая будет создавать пустой элемент списка с указателем Р.

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

Р = Avail

Avail = Ptr(Avail)

Перед этим надо проверить, есть ли элементы в списке. Пустота свободного списка (Avail = Nil), эквивалентна пер переполнению функционального списка.

If Avail = Nil

then Print “Переполнение

Stop

else P = Avail

Avail = Ptr(Avail)

endif

return

Операция FreeNode

При освобождении элемента Nod(P) из функционально­го списка операцией FreeNode(P), он заносится в свободный список.

Ptr(P) = Avail

Avail = Р

return

Утилизация освободившихся элементов в многосвязных списках

Стандартные операции возвращения освободившегося элемента списка в пул свободных элементов не всегда дают эффект, если используются нелинейные многосвязные спи­ски.

Первый способ утилизации - метод счетчиков. В каждый элемент многосвязного списка вставляется поле счетчика, ко­торый считает количество ссылок на данный элемент. Когда счетчик элемента оказывается в нулевом состоянии, а поля указателей элемента находятся в состоянии nil, этот элемент может быть возвращен в пул свободных элементов.

Второй способ - метод сборки мусора (метод маркера). Если с каким-то элементом установлена связь, то однобито­вое поле элемента (маркер) устанавливается в "1", иначе - в "О". По сигналу переполнения ищутся элементы, у которых маркер установлен в ноль, т. е. включается программа сборки мусора, которая просматривает всю отведенную память и возвращает в список свободных элементов все элементы, не помеченные маркером.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]