
Лабораторная работа №1
Тема: Динамические структуры данных. Их реализация на базе массивов
Любые данные, обрабатываемые компьютером, могут быть отнесены к одному из двух типов: простому, форма представления которого определяется архитектурой ЭВМ, или сложному, конструируемому пользователем для решения конкретных задач. Данные простого типа это - символы, числа и тому подобные элементы, дальнейшее дробление которых не имеет смысла. Из элементарных данных формируются структуры данных (сложные типы). К ним относятся такие структуры как массивы, множества, записи. Перечисленные структуры занимают в памяти ЭВМ постоянный объем, поэтому их называют статическими структурами.
Имеется ряд структур, которые могут изменять свой размер - так называемые динамические структуры. К ним относятся деревья, списки, графы, хэш-таблицы.
Рис.
1.1. Классификация структур данных
Под СТРУКТУРОЙ ДАННЫХ в общем случае понимают множество элементов данных и множество связей между ними. Структуры данных формируются с помощью типов данных, ссылок и операций над ними в выбранном языке программирования.
Часто структура данных является реализацией какого-либо абстрактного типа данных.
Абстрактный тип данных (АТД) – это множество объектов, представляющих элементы данных и набор операций, которые могут быть выполнены над элементами этого множества.
При рассмотрении любой структуры данных необходимо сначала описать ее с логической точки зрения, а затем рассмотреть различные способы ее реализации.
Реализация АТД на основе базовой структуры — это описание ее работы в терминах базовой структуры. При этом считается, что базовая структура либо дана изначально, либо уже кем-то реализована.
Реализация АТД включает в себя:
описание идеи реализации АТД (каким образом элементы реализуемой структуры хранятся в базовой структуре, какие дополнительные переменные используются)
набор подпрограмм, с помощью которых обрабатывается АТД.
Программисту
массив дан свыше, все остальные структуры
данных нужно реализовывать на его
основе.
Стек. Реализация стека на базе массива
Стек представляет собой запоминающее устройство, из которого элементы извлекаются в порядке, обратном их добавлению, т.е. элемент, добавленный в стек последним, удаляется первым. Дисциплина работы стека обозначается LIFO (Last In First Out - последним пришел — первым уйдешь).
С
Рис. 1
тек
можно представить в виде трубки с
подпружиненным дном, расположенной
вертикально. Верхний конец трубки
открыт, в него можно добавлять элементы.
Общепринятые английские термины в этом
плане очень красочны, операция добавления
элемента в стек обозначается push, в
переводе "затолкнуть, запихнуть".
Новый добавляемый элемент проталкивает
элементы, помещенные в стек ранее, на
одну позицию вниз. При извлечении
элементов из стека они как бы выталкиваются
вверх, по-английски pop (
Примером стека может служить детская пирамидка, стог сена, стопка бумаг на столе, железнодорожный тупик, стопка тарелок. Отсюда произошло название стека, что по-английски означает стопка. Тарелки снимаются со стопки в порядке, обратном их добавлению. Доступна только верхняя тарелка, т.е. тарелка на вершине стека.
О
1
2
3
4
5
6
N
S
15
6
22
7
Top=4
В
Рис. 2
Необходима дополнительная переменная Top, в которой хранится индекс вершины стека. Если tор = 0, то стек пуст. Если tор=n, то при попытке добавить элемент в стек происходит переполнение стека, поскольку размер стека в нашей реализации ограничен размером массива N.
Процедуры обработки стека:
Д
1
2
3
4
5
6
7
S
15
6
22
7
2
Top=5 S[Top]=2
Procedure PUSH (S, top, a)
{добавление элемента а в стек}
If Top<>n then Top=Top+1
Рис. 3
else ‘Стек переполнен’
у
-
1
2
3
4
5
6
7
S
15
6
22
7
2
Top=4
-
Function POP (S, top):int
{Извлечение элемента из стека}
If Top=0 then ‘Стек пуст’
else Pop=S[Top]
Рис. 4