Стек – упорядоченный список, в котором добавление и удаление элементов всегда происходит на одном конце списка. Работает по принципу: Первый вошел -> последний вышел. Добавление элемента в стек называется проталкиванием элемента, а удаление – выталкиванием. Объявить стеки:

Dim Stack() As Variant

Dim Stack_Size As Variant

Sub Push (value As Variant)

Stack_Size = Stack_Size + 1

ReDim Preserve Stack ( 1 To Stack_Size)

Stack (Stack_Size) = value

End Sub

Sub Pop (value As Variant)

Value = Stack (Stack_Size)

Stack_Size = Stack_Size – 1

Re Dim Preserve Stack ( 1 To Stack_Size)

End Sub

Пример алгоритма обращения порядка элементов массива с использованием стека.Все элементы последовательного проталкиваются в стек, а затем все элементы выталкиваются в обратном порядке и записываются обратно в массив.

Dim List() As Variant

Dim NumItems As Integer

à     Ввод массива

For I = 1 To NumItems

Push (List(I))

Next I

For I = 1 To NumItems

Pop (List(I))

Next I

Если заранее известно на сколько большим должен быть массив, можно сразу создать достаточно большой стек. Вместо изменения размера стека по мере того, как он растет или уменьшается можно отвести под него память в начале работы и уничтожить его после завершения. Определяем константу, которая будет хранить 10% от свободного пространства:

Const WFP = 0.1

Const Min_Free = 10

Global Stack() As Variant

Global Stack_Size As Variant

Global LastItem As Variant

Sub Prealocate Stack(entries As Variant)

Stack_Size = entries

ReDim Stack (1 To Stack_Size)

End Sub

Sub Empty Stack()

Stack_Size = 0

Last_Item = 0

Erase Stack

End Sub

Sub Push (value As variant)

Last_Item = Last_Item + 1

If Last_Item > Stack_Size then ResizeStack

Stack (Last_Item) = value

End Sub

Sub Pop (value As Variant)

value = Stack (Last_Item)

Last_Item = Last_Item – 1

End Sub

Sub ResizeStack()

Dim WF As Variant

WF = WFP * Last_Item

If WF < Min_Free then WF = Min_Free

Stack_Size = Last_Item + WF

reDim Preserve Stack ( 1 To Stack_Size)

End Sub