Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методички / Лаб_6_Структуры данных (1)

.docx
Скачиваний:
0
Добавлен:
28.06.2026
Размер:
29.41 Кб
Скачать

Лабораторная работа №6: Структуры данных

Цель работы:

Изучить основные линейные структуры данных, рассмотреть различия между абстрактными типами данных и их реализациями, научиться реализовывать структуры данных на языке Python и сравнивать их по поддерживаемым операциям и эффективности выполнения типовых действий.

Задание 1. Динамический список на основе массива

Рассматривается задача хранения и обработки последовательности целых чисел в памяти. Необходимо реализовать список на основе массива переменной длины. В такой реализации следует использовать две основные характеристики структуры: capacity — емкость массива и size — текущее количество элементов. При нехватке места необходимо создавать новый массив большего размера, копировать в него существующие данные и продолжать работу уже с новым массивом.

Требуется реализовать следующие операции:

добавление элемента в конец списка;

вставка элемента по индексу;

удаление элемента по индексу;

получение элемента по индексу;

получение текущего размера списка.

Для проверки работы структуры используйте следующую последовательность операций:

добавить в пустой список значения 5, 0, 1, 7, 9, 4, 6, 2, 1;

вставить значение 8 по индексу 7;

удалить элемент по индексу 5;

вывести итоговое содержимое списка и его размер.

После выполнения необходимо объяснить, почему получение элемента по индексу в массиве выполняется эффективно, а вставка и удаление требуют сдвига части элементов. Также необходимо сделать вывод о том, чем статический массив отличается от динамического массива и почему для реализации списка на основе массива требуется отдельно хранить size и capacity.

Примечание: при нехватке места создавайте массив в 2 раза больше предыдущего

Задание 2. Односвязный список

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

Требуется реализовать следующие методы:

добавление значения в начало списка;

добавление значения в конец списка;

удаление первого элемента;

удаление последнего элемента;

получение значения по индексу;

получение размера списка.

Для тестирования необходимо создать список, последовательно добавить в него значения 5, 3, 5, 20, затем добавить значение 7 в конец списка, удалить первый элемент, удалить последний элемент (при удалении последнего элемента нам не нужно хранить tail, храним только head) и вывести итоговую последовательность.

После выполнения необходимо объяснить, в чём состоят преимущества и недостатки односвязного списка по сравнению с массивом, почему добавление и удаление в начале списка выполняются просто, а получение элемента по индексу требует последовательного прохода по узлам. Также необходимо сделать вывод о том, какую роль играет указатель head.

Задание 3. Стек на основе связанного списка

Рассматривается задача реализации стека — абстрактного типа данных, работающего по принципу LIFO («последним пришёл — первым вышел»). Необходимо реализовать стек на основе односвязного списка (используйте список из задания 2).

Требуется реализовать следующие операции стека:

push — добавление элемента в вершину стека;

pop — получение элемента с удалением;

peek — получение элемента без удаления;

size — получение количества элементов в стеке.

Для тестирования выполните последовательность действий: поместить в стек значения 5, 0, 1, 7, 9, затем вывести верхний элемент без удаления, удалить два элемента, снова вывести верхний элемент и определить итоговый размер стека.

После выполнения необходимо объяснить, почему стек на основе связанного списка удобно реализовывать через операции добавления и удаления из головы списка, а также сделать вывод о том, какие операции в такой реализации выполняются за константное время.

Задание 4. Сравнение массива и связанного списка

Необходимо провести небольшое вычислительное исследование и сравнить между собой две структуры данных: динамический список на основе массива и односвязный список. Исследование должно показать, как различаются эти структуры по затратам на основные операции.

Требуется экспериментально сравнить следующие действия:

добавление элемента в конец;

удаление элемента из начала;

получение элемента по индексу;

получение размера структуры.

Для эксперимента рекомендуется использовать размеры входных данных:

N = 10^2;

N = 10^3;

N = 10^4.

Допускается выполнять каждую операцию несколько раз с последующим усреднением времени. Результаты следует представить в виде таблицы или графика.

После выполнения необходимо объяснить, почему массивы оказываются особенно удобными для индексного доступа, а связанные списки — для операций добавления и удаления элементов без сдвига большого числа значений. Итогом задания должен стать вывод о том, в каких случаях лучше использовать массив, а в каких — связанный список.

Контрольные вопросы:

1. Что такое структура данных?

2. Чем абстрактный тип данных отличается от структуры данных?

3. Какие структуры называют статическими, а какие динамическими?

4. Что такое массив и какие операции он поддерживает?

5. Почему получение элемента массива по индексу считается эффективной операцией?

6. Что такое список как абстрактный тип данных?

7. В чём различие между списком на основе массива и связанным списком?

8. Что такое односвязный список?

9. Какие преимущества и недостатки имеет односвязный список по сравнению с массивом?

10. Что такое стек и по какому принципу он работает?

11. Какие операции поддерживает стек?

12. Почему стек удобно реализовывать на основе связанного списка?

13. Что такое очередь и по какому принципу она работает?

14. Какие операции поддерживает очередь?

15. Почему связанные списки требуют дополнительной памяти?

16. Как выбрать подходящую структуру данных для конкретной задачи?