Сайт о программировании, математике и моделировании
Очереди и стеки
Стек – упорядоченный список, в котором добавление и удаление элементов всегда происходит на одном конце списка. Работает по принципу: Первый вошел -> последний вышел. Добавление элемента в стек называется проталкиванием элемента, а удаление – выталкиванием. Объявить стеки:
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 |
Print article | This entry was posted by root on 03.12.2010 at 6:35 пп, and is filed under Информатика и программирование. Follow any responses to this post through RSS 2.0. Вы можете оставить комментарий или трэкбэк с вашего сайта. |
5 месяцев назад
А нельзя ли выложить пример с программным кодом или ссылкой на работающую программу?