- •1. Архитектура машинной памяти
- •2. Адресация памяти
- •3. Три уровня представления данных
- •4.Внутренняя структура записи
- •5. Типы структур данных
- •7. Массивы
- •8. Стеки
- •9.Очередь
- •10. Таблица
- •11. Способы размещения, основанные
- •12.Сортировка. Метод выбора
- •13. Метод обмена (пузырька)
- •14. Метод вставок
- •15. Метод подсчета
- •16. Метод Шелла
- •17.Внешняя сортировка
- •18. Последовательный поиск
- •19. Ускоренные методы поиска. Двоичный поиск. Блочный поиск
- •20.Поиск по двоичному дереву
7. Массивы
Массив — это линейная структура данных фиксированного размера, реализуемая с использованием последовательного представления данных. Понятие массива как структуры данных не тождественно понятию информационного массива, определяющему совокупность данных, обрабатываемых АИС.
Каждый элемент массива идентифицируется одним или несколькими индексами. Индекс — это целое число, значение которого определяет позицию соответствующего элемента в массиве и используется для осуществления доступа к этому элементу. Отдельные элементы массива могут изменяться (т.е. записи могут модифицироваться), но общее число элементов массива всегда остается неизменным; следовательно, для массивов нет операций добавления и удаления.
В зависимости от числа индексов, идентифицирующих каждый элемент массива, различают одномерные и многомерные массивы.
Одномерный массив называется вектором. Вектор А = {А (1)А (2)... A(I)..A(N) } — это последовательность элементов (записей), размещенных в смежных ячейках памяти. Единственный индекс вектора указывает позицию каждого элемента в последовательности.
Адрес первого байта, выделенного для первого элемента вектора, называется адресом базы вектора. Вектор в целом определяется адресом базы, размером элементов и их числом или размером элементов и диапазоном изменения индекса (рис. 8.1). Если L0 — адрес первого байта в блоке памяти, выделенном для хранения вектора, с — число байтов, выделенное для хранения каждого элемента, то адрес любого i-го элемента будет
1ос(Аi.) =L0 +с(i-1)
Двумерный массив называется матрицей. Каждый элемент матрицы определен двумя индексами. В общем случае массив может иметь любую размерность, т.е. являться многомерным. Многомерный массив может быть представлен эквивалентным одномерным массивом. Например, матрицу можно рассматривать как вектор, элементы которого, в свою очередь, являются векторами. При этом матрица может рассматриваться и храниться в памяти ЭВМ как "строка строк" и как "строка столбцов". Хранение элементов матрицы в такой последовательности называют размещением по строкам
При размещении по строкам адрес матричного элемента А (i, j) определяется выражением
loc(Aij) =L0+ cm(i - 1) + с (j - 1) где m — число столбцов.
В общем случае массив может иметь любую размерность. Для n-мерного массива указывается число размерностей, а также верхняя и нижняя границы диапазона изменения индексов.
В ряде случаев бывает необходимо в одном массиве хранить данные различных типов. Такой массив называется неоднородным. Например, при хранении личной карточки студента элементами массива являются фамилия, возраст, адрес, средний балл и т.д. Доступ к элементам такого массива может быть осуществлен по индексу, представленному в символьной форме.
Из одномерных неоднородных массивов могут быть организованы многомерные неоднородные массивы, например массив, описывающий всех студентов группы.
8. Стеки
Стек — это линейная структура переменного размера, в отличие от структуры массива позволяющая включать или исключать элементы, т.е. объем данных в стеке может динамически расти и сокращаться во время выполнения программы.
Особенность стековой структуры в том, что доступ к элементам, включение и исключение элементов возможны только с одного конца структуры — с вершины стека. Поэтому первым будет прочитан или выбран тот элемент, который включался в стек последним. Информация в такой структуре обрабатывается по принципу "последним пришел, первым ушел". Структуру стека иногда называют структурой типа LIFO.
Структура стека является структурой данных с ограниченным доступом, так как доступ разрешается только к элементу, находящемуся в вершине стека. Этот элемент называется текущим. Информацию о позиции текущего элемента стека хранит указатель вершины стека (УВС), размещаемый обычно в головной ячейке стека.
При использовании последовательного представления необходимо знать предельный размер стека. Под этот предполагаемый предельный размер резервируется блок памяти, внутри которого стек растет и сокращается. Первая ячейка блока содержит указатель вершины стека. Когда стек пуст, указатель указывает на самого себя. При включении каждого нового элемента указатель вершины увеличивается на единицу.
Доступ к стеку может быть организован так, чтобы значение указателя вершины оставалось неизменным в течение всего времени существования стека. В этом случае доступ осуществляется всегда к одной и той же ячейке блока памяти, зарезервированного под стек. На эту ячейку
устанавливается указатель вершины, в ней хранится текущий (верхний) элемент стека. При включении или исключении элемента все остальные элементы стека перемещаются вниз или вверх соответственно внутри блока памяти (рис. 8.3). В этом случае операцию включения иногда называют проталкиванием , а операцию исключения "выталкиванием".
Недостаток последовательного представления стека состоит в том, что всегда остается опасность переполнения стека; в противном случае часть зарезервированной памяти остается неиспользованной.
При использовании связанного представления данных нет необходимости заранее резервировать память под стек. Все элементы стека разбросаны по памяти и связаны между собой указателями. УВС указывает на ячейку с верхним элементом стека. При включении и исключении элементов значение указателя вершины изменяется. Вновь включаемый элемент размещается в любой свободной ячейке памяти, которая включается в стек путем соответствующего изменения указателей связанного списка. Стек при связанном представлении данных может расти неограниченно.
Структура стека удобна в тех случаях, когда требуется быстрое выполнение операций включения и исключения без оценки содержательного смысла данных. Алгоритм, управляющий включением освободившихся ячеек в стек свободной памяти, часто называют "сборщиком мусора". Стековые структуры широко применяются в трансляторах при реализации вложенных подпрограмм и многоуровневых прерываний, а также при решении задач, алгоритмы которых лучше всего описываются рекурсивным методом.