Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры и алгоритмы обработки данных.doc
Скачиваний:
365
Добавлен:
12.03.2015
Размер:
1.81 Mб
Скачать

2.2. Статическая реализация стека

Пусть в стеке требуется сохранять целые числа, причем заранее известно их максимальное количество. Тогда для реализации стека надо объявить массив и одну переменную – указатель вершины стека (SP – Stack Pointer).Будем считать, что стек-массив заполняется (растет) от первых элементов массива к последним. Тогда указатель SP может определять либо последнюю занятую ячейку массива, либо первую свободную ячейку. Выберем второй способ. Тогда для пустого стека переменная SP = 1 (если индексация элементов массива начинается с 1), и при каждом добавлении нового элемента переменная SP увеличивается на 1, а при удалении – уменьшается на 1. Последовательность операций для массива из пяти элементов показана на следующей схеме

1. Пустой стек: sp=1

15

2. Добавлено первое число 15, sp=2

15

33

3. Добавлено второе число 33, sp=3

15

33

07

4. Добавлено третье число 07, sp=4

15

33

5. Удалено с вершины число 07, sp=3

15

6. Удалено с вершины число 33, sp=2

Со стеком связываются две основные операции: добавление (вталкивание, PUSH) элемента в стек и удаление (выталкивание, POP) элемента из стека.

Добавление включает в себя:

  • проверку возможности добавления (стек-массив заполнен полностью?)

  • размещение нового элемента в ячейке, определяемой значением переменной SP

  • увеличение SP на 1

Удаление включает в себя:

  • проверку возможности удаления (стек пустой?)

  • уменьшение SP на 1

  • извлечение элемента из ячейки, определяемой значением переменной SP

2.3. Динамическая реализация стека

В отличие от статической реализации на основе массива, при использовании механизма динамического выделения памяти в стек можно занести любоечисло элементов. Ограничением является только размер области памяти, выделяемой для размещения динамически создаваемых переменных. При динамической реализации элементы стека могут располагаться в ЛЮБЫХ свободных областях памяти, но при этом необходимо как-то связывать соседние элементы друг с другом. Это приводит к необходимости добавления в каждый элемент стека нового связующего поля для хранения адреса соседнего элемента. Тем самым, каждый элемент стека должен представлять собой запись, состоящую из двух компонент:

  • информационная составляющая с полезной смысловой информацией

  • связующая составляющая для хранения адреса соседнего элемента

Учитывая специфику стека, указатели должны следовать от последнего элемента (вершина стека) к первому (дно стека).

инф. составляющая элемента i+ 1

адрес предыдущего элемента

инф. составляющая элемента i

адрес предыдущего элемента

инф. составляющая элемента i+ 2

адрес предыдущего элемента

В этом случае физическое размещение элементов в памяти НЕ обязано всегда соответствовать логическому порядку следования элементов. Логический порядок элементов определяется адресными частями при проходе от последнего элемента к первому. Структура оперативной памяти в этом случае может выглядеть следующим образом:

вершина стека

элем. N-3

элем. N-1

элем. N

элем. N-2

элем. N-4

адрес N-4

адрес N-2

адрес N-1

адрес N-3

адрес N-5

Для построения логического порядка следования элементов достаточно знать вершинный элемент, все остальное восстанавливается по адресным частям элементов независимо от их реального размещения в памяти.

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

Как реализовать связующее поле? Поскольку в связующих полях должны храниться адреса, то следует использовать переменные ссылочного типа.

Что должны адресовать эти переменные? Элементы стека, т.е. записи определенного типа. Следовательно, прежде всего надо ввести ссылочный тип, связанный с базовым типом-записью, а затем – описать базовый тип как запись с необходимыми полями, одно из которых должно быть ссылочного типа:

type pStackItem = ^ TStackItem;