logo search
Высокоцровневые методы информатики и првые методы информатики и программированияограммирования

3.1.2 Стек

Стек можно реализовывать как статическую структуру данных в виде одномерного массива, а можно как динамическую структуру – в виде линейного списка.

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

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

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

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

Рисунок 3.6 – Стек и его организация

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

Описание элементов стека аналогично описанию элементов линейного однонаправленного списка, где DataType является типом элементов стека.

Основные операции, производимые со стеком:

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

procedure PushStack(NewElem: TypeData;

var ptrStack: PElement);

{Запись элемента в стек (положить в стек)}

begin

InsFirst_LineSingleList(NewElem, ptrStack);

end;

procedure PopStack(var NewElem: TypeData,

ptrStack: PElement);

{Чтение элемента из стека (снять со стека)}

begin

if ptrStack <> nil then begin

NewElem := ptrStack^.Data;

Del_LineSingleList(ptrStack, ptrStack); {удаляем вершину}

end;

end;

procedure ClearStack(var ptrStack: PElement);

{Очистка стека}

begin

while ptrStack <> nil do

Del_LineSingleList(ptrStack, ptrStack); {удаляем вершину}

end;

function EmptyStack(var ptrStack: PElement): boolean;

{Проверка пустоты стека}

begin

if ptrStack = nil then EmptyStack := true

else EmptyStack := false;

end;

Листинг 3.16 – Реализация стека на базе линейного однонаправленного списка

Листинг 3.17 – Операции со стеком