Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 8
На сайте нет зарегистрированных пользователей

Пользователей: 13,372
новичок: vausoz
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Расчет обратной матрицы на Delphi + Пояснительная записка
Моделирование процесса поступления заявок в систему, состоящую из трёх Э...
Моделирование ЭВМ на GPSS (три класса заданий) + Пояснительная записка

Стеки в Delphi
Стек (stack) - это упорядоченный список, где элементы всегда добавляются
и удаляются с одного конца. Стек можно сравнить со стопкой книг на полу. Вы
можете добавлять книги на вершину стопки и убрать их с вершины, но добавить
или убрать книгу из середины стопки вы не сможете.
Стеки часто называют списками типа последний пришел — первый вышел (Last-
In-First-Out list — LIFO). По историческим причинам добавление элемента в стек
называется проталкиванием (pushing), а удаление - выталкиванием (popping).
Первая реализация простого списка на основе массива, описанное в начале
главы 2, является стеком. Для отслеживания положения вершины списка исполь-
зуется счетчик. Затем с помощью счетчика осуществляется вставка и удаление эле-
ментов из вершины списка.
Единственное незначительное изменение, сделанное в данном случае, - это
введение новой функции Pop, которая удаляет элемент из стека и возвращает его
значение. Это позволяет другим процедурам отыскивать элемент и удалять его из
стека за один шаг.

// Проталкивание элемента в стек.
procedure TArrayStack.Push(value : String);
begin
// Убедиться, что для элемента есть место.
if (NumItems>=NumAllocated) then ResizeStack;
Numltems := Numltems+1;
Stack^[Numltems] := value;
end;
// Выталкивание элемента из стека.
function TArrayStack.Pop : String;
begin
if (Numltems<l) then
raise EInvalidOperation.Create('Стек пустой.');
Result := Stack^[Numltems] ;
NumIterns := NumIterns-1;
if (NumItems<ShrinkWhen) then ResizeStack;
end;




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

procedure ReverseArray;
var
the_stack : TArrayStack;
i : Integer;
begin
// Создание стека.
the_stack := TArrayStack.Create;
// Проталкивание элементов в стек.
for i := 1 to Numltems do
the_stack.Push(the_array[i]);
// Выталкивание элементов из стека и помещение их обратно в массив.
for i := 1 to Numltems do
the_array[i] := the_stack.Pop;
end;




В этом примере длина стека может многократно изменяться до тех пор, пока он
не опустеет. Если вы заранее знаете, каким должен быть размер массива, лучше сра-
зу создать подходящий стек. Тогда вместо изменения размера стека по мере того,
как он растет или уменьшается, достаточно будет выделить под него память в нача-
ле работы и очистить ее после окончания действий.
Следующий код позволяет заранее сформировать стек, если сразу известен его
максимальный размер. Функция Pop не изменяет размер массива. Когда програм-
ма заканчивает работу со стеком, она должна вызвать процедуру FreeStack для
освобождения занятой под стек памяти.

// Создание большого массива, достаточного для размещения всего стека.
procedure TArrayStack.PreallocateStack(entries : Integer);
begin
NumAllocated := entries;
GetMem(Stack,NumAllocated*SizeOf(Longint));
end;
// Освобождение массива стека.
procedure TSimpleStack.FreeStack;.
begin
NumAllocated := 0;
PreeMem(Stack);
end;
// Проталкивание элемента в стек.
procedure TArrayStack.Push(value : String);
begin
// Убедиться, что для элемента есть место
if (NumItems>=NumAllocated) then
raise EInvalidOperation.Create('Стек заполнен.');
Numltems := Numltems+l;
Stack^[NumItems] := value;
end;
// Выталкивание элемента из стека.
function TArrayStack.Pop : String;
begin
if (Numltems<l) then
raise EInvalidOperation.Create('Стек пустой.');
Result := Stack^[Numltems];
NumIt ems : = NumItems-1;
end;




Этот способ реализации стеков весьма эффективен. Стек не расходует пона-
прасну память, и не требуется дополнительное время для частого изменения его
размера, особенно если сразу известно, насколько большим он должен быть.
Опубликовал Kest September 22 2009 20:49:00 · 0 Комментариев · 20895 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
PHP: настольная к...
Text effect
Программа предназ...
Dynamic Titles дл...
Стелтинг Стивен, ...
Delphi 2005 Учимс...
Использование Lis...
Работа с матрицами
IMtale
Интерактивный инт...
CoolControls v3.0...
Calendar
GPSS World Studen...
База игр
Abbrevia
Rss Parser
C++ для начинающих
Handles
Фундаментальные а...
Atb

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97838
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14192
Borland Delphi ... 10292
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Плотность изображе...
Семантика HDLC
Разработать прикл...
Процесс нагрева во...
Установка подсветк...
Процедура ClearDev...
Руки прочь от PHP!
Параметры восстано...
Базы данных и базы...
ОСНОВНЫЕ КОНЦЕПЦИИ...
Спуск затвора фото...
Решение задачи, ис...
Протокол анонсиров...
String variable ex...
ir.f /overwriteВне...
Как запускать прог...
Дизайнерские ресур...
Глава 11. Как э...
Основные недостатк...
Использование прог...
Broadcast-шторм
Лексический анализ...
Многопользовательс...
Учебник Паскаль
Модуль Image
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?