
- •Содержание
- •Введение
- •1. Cтруктуры данных и алгоритмы
- •1.1. Понятие структур данных и алгоритмов
- •1.2. Информация и ее представление в памяти
- •1.2.1. Природа информации
- •1.2.2. Хранение информации
- •1.3. Системы счисления
- •1.3.1. Непозиционные системы счисления
- •1.3.2. Позиционные системы счисления
- •1.3.3. Изображение чисел в позиционной системе счисления
- •1.3.4. Перевод чисел из одной системы счисления в другую
- •1.4. Классификация структур данных
- •1.5. Операции над структурами данных
- •1.6. Структурность данных и технология программирования
- •2. Простые структуры данных
- •2.1. Числовые типы
- •2.1.1. Целые типы
- •2.1.2. Вещественные типы
- •1). Число 15.375;
- •2). Десятичное число 0.0375;
- •3). Десятичное число 2.5;
- •4). Значения верхней и нижней границ диапазона положительных чисел:
- •1). Число -15.375;
- •2). Число 1.0;
- •3). Значения верхней и нижней границ диапазона положительных чисел
- •2.1.3. Десятичные типы
- •2.1.4. Операции над числовыми типами
- •2.2. Битовые типы
- •2.3. Логический тип
- •2.4. Символьный тип
- •2.5. Перечислимый тип
- •2.6. Интервальный тип
- •2.7. Указатели
- •2.7.1. Физическая структура указателя
- •2.7.2. Представление указателей в языках программирования
- •2.7.3. Операции над указателями.
- •3. Статические структуры данных
- •3.1. Векторы
- •3.2. Массивы
- •3.2.1. Логическая структура
- •3.2.2. Физическая структура
- •3.2.3. Операции
- •3.2.4. Адресация элементов с помощью векторов Айлиффа
- •3.2.5. Специальные массивы
- •3.3. Множества
- •3.3.1. Числовые множества
- •3.3.2. Символьные множества
- •3.3.3. Множество из элементов перечислимого типа
- •3.3.4. Множество от интервального типа
- •3.3.5. Операции над множествами
- •3.4. Записи
- •3.4.1. Логическое и машинное представление записей
- •3.4.2. Операции над записями
- •3.5. Записи с вариантами
- •3.6. Таблицы
- •3.7. Операции логического уровня над статическими структурами. Поиск
- •3.7.1. Последовательный или линейный поиск
- •3.7.2. Бинарный поиск
- •3.8. Операции логического уровня над статическими структурами. Сортировка
- •3.8.1. Сортировки выборкой
- •3.8.2. Сортировки включением
- •3.8.3. Сортировки распределением.
- •3.8.4. Сортировки слиянием.
- •4. Полустатические структуры данных
- •4.1. Характерные особенности полустатических структур
- •4.2. Стеки
- •4.2.1. Логическая структура стека
- •4.2.2. Машинное представление стека и реализация операций
- •4.2.3. Стеки в вычислительных системах
- •4.3. Очереди fifo
- •4.3.1. Логическая структура очереди
- •4.3.2. Машинное представление очереди fifo и реализация операций
- •4.3.3. Очереди с приоритетами
- •4.3.4. Очереди в вычислительных системах
- •4.4. Деки
- •4.4.1. Логическая структура дека
- •4.4.2. Деки в вычислительных системах
- •4.5. Строки
- •4.5.1. Логическая структура строки
- •4.5.2. Операции над строками
- •4.5.3. Представление строк в памяти.
- •5. Динамические структуры данных. Связные списки
- •5.1. Связное представление данных в памяти
- •5.2. Связные линейные списки
- •5.2.1. Машинное представление связных линейных списков
- •5.2.2. Реализация операций над связными линейными списками
- •5.2.3. Применение линейных списков
- •5.3. Мультисписки
- •5.4. Нелинейные разветвленные списки
- •5.4.1. Основные понятия
- •5.4.2. Представление списковых структур в памяти.
- •5.4.3. Операции обработки списков
- •5.5. Язык программирования lisp
- •5.6. Управление динамически выделяемой памятью
- •6. Нелинейные структуры данных
- •6.1.Графы
- •6.1.1. Логическая структура, определения
- •6.1.2. Машинное представление оpгpафов
- •6.2. Деревья
- •6.2.1. Основные определения
- •6.2.2. Логическое представление и изображение деревьев.
- •6.2.3. Бинарные деревья.
- •6.2.4. Представление любого дерева, леса бинарными деревьями.
- •6.2.5. Машинное представление деревьев в памяти эвм.
- •6.2.6. Основные операции над деревьями.
- •6.2.7. Приложения деревьев.
- •6.2.8 Деревья Хаффмена (деревья минимального кодирования)
- •6.2.9 Деревья при работе с арифметическими выражениями
- •6.2.10 Формирование таблиц символов.
- •6.2.11 Сбалансированные деревья
4.2.2. Машинное представление стека и реализация операций
При представлении стека в статической памяти для стека выделяется память, как для вектора. В дескрипторе этого вектора кроме обычных для вектора параметров должен находиться также указатель стека - адрес вершины стека. Указатель стека может указывать либо на первый свободный элемент стека, либо на последний записанный в стек элемент. (Все равно, какой из этих двух вариантов выбрать, важно в последствии строго придерживаться его при обработке стека.) В дальнейшем мы будем всегда считать, что указатель стека адресует первый свободный элемент и стек растет в сторону увеличения адресов.
При занесении элемента в стек элемент записывается на место, определяемое указателем стека, затем указатель модифицируется таким образом, чтобы он указывал на следующий свободный элемент (если указатель указывает на последний записанный элемент, то сначала модифицируется указатель, а затем производится запись элемента). Модификация указателя состоит в прибавлении к нему или в вычитании из него единицы (помните, что наш стек растет в сторону увеличения адресов.
Операция исключения элемента состоит в модификации указателя стека (в направлении, обратном модификации при включении) и выборке значения, на которое указывает указатель стека. После выборки слот, в котором размещался выбранный элемент, считается свободным.
Операция очистки стека сводится к записи в указатель стека начального значения - адреса начала выделенной области памяти.
Определение размера стека сводится к вычислению разности указателей: указателя стека и адреса начала области.
Программный модуль, представленный в примере 4.1, иллюстрирует операции над стеком, расширяющимся в сторону уменьшения адресов. Указатель стека всегда указывает на первый свободный элемент.
В примерах 4.1 и 4.3 предполагается, что в модуле будут уточнены определения предельного размера структуры и типа данных для элемента структуры:
const SIZE = ...;
type data = ...;
{==== Программный пример 4.1 ====}
{ Стек }
unit Stack;
Interface
const SIZE=...; { предельный размер стека }
type data = ...; { эл-ты могут иметь любой тип }
Procedure StackInit;
Procedure StackClr;
Function StackPush(a : data) : boolean;
Function StackPop(Var a : data) : boolean;
Function StackSize : integer;
Implementation
Var StA : array[1..SIZE] of data; { Стек - данные }
{ Указатель на вершину стека, работает на префиксное вычитание }
top : integer;
Procedure StackInit; {** инициализация - на начало }
begin top:=SIZE; end; {** очистка = инициализация }
Procedure StackClr;
begin top:=SIZE; end;
{ ** занесение элемента в стек }
Function StackPush(a: data) : boolean;
begin
if top=0 then StackPush:=false
else begin { занесение, затем - увеличение указателя }
StA[top]:=a; top:=top-1; StackPush:=true;
end; end; { StackPush }
{ ** выборка элемента из стека }
Function StackPop(var a: data) : boolean;
begin
if top=SIZE then StackPop:=false
else begin { указатель увеличивается, затем - выборка }
top:=top+1; a:=StA[top]; StackPop:=true;
end; end; { StackPop }
Function StackSize : integer; {** определение размера }
begin StackSize:=SIZE-top; end;
END.