Skip to content

Практическая работа №9

Линейные структуры данных в C++

Section titled “Линейные структуры данных в C++”

Цель работы: Научиться реализовывать основные линейные структуры данных (массив, список, стек и очередь), понимать их применение и различия, научиться проводить базовые операции и анализировать их

Основные теоретические положения

Section titled “Основные теоретические положения”

Основные линейные структуры данных:

  1. Массив — статическая структура, элементы которой располагаются подряд в памяти, позволяет доступ по индексу.
  2. Односвязный список — динамическая структура из элементов (узлов), каждый из которых содержит данные и указатель на следующий элемент.
  3. Стек — структура данных, работающая по принципу LIFO (последним пришёл — первым вышел), поддерживает операции push/pop.
  4. Очередь — структура данных, работающая по принципу FIFO (первым пришёл — первым вышел), поддерживает операции enqueue/dequeue.

Краткие характеристики

СтруктураДоступВставка/УдалениеИспользование
МассивБыстрый по индексуМедленная, сдвиги элементовКогда известен размер заранее
Односвязный списокПоследовательныйБыстрая с корректным указателемДинамическое изменение размера
СтекПоследовательныйpush/pop — быстрые операцииОбратный порядок, рекурсия
ОчередьПоследовательныйenqueue/dequeueПланирование, буферы данных

Пример реализации (теория, псевдокод)

Section titled “Пример реализации (теория, псевдокод)”

Свой стек (на массиве):

  • Вводим массив фиксированной длины data[N].
  • Переменная top хранит индекс последнего элемента.
  • push(x): увеличить top, вставить x.
  • pop(): вернуть и уменьшить top.
  • Проверка: если top < 0 — стек пуст.

Своя очередь (на массиве, кольцевой буфер):

  • Массив с длиной N.
  • Переменные head (индекс первого для удаления), tail (индекс для вставки).
  • Добавление: в позицию tail, затем увеличиваем tail (по модулю N).
  • Удаление: из позиции head, затем увеличиваем head (по модулю N).
  • Проверка переполненности: если следующий tail == head, очередь заполнена.

Компиляция и запуск программы

Section titled “Компиляция и запуск программы”
Terminal window
g++ *имя_файла*.cpp -o *название_файла_для_компиляции*
./*название_скомпилированного_файла*

Задания для выполнения

Section titled “Задания для выполнения”

Вариант 1

ЗадачаОписание
1Реализация стекаРеализуйте свой стек на массиве. Добавьте 10 элементов с клавиатуры, затем снимите все элементы по одному, выведите содержимое.
2Реализация очередиРеализуйте свою очередь на массиве. Заполните 10 элементов, выполняйте удаление и добавление, выведите состояние очереди на каждом шаге.
3АнализОпишите возможные проблемы при переполнении/опустошении структур, сравните их алгоритмические особенности.

Вариант 2

ЗадачаОписание
1Стек на связном спискеРеализуйте стек через односвязный список. Тест: добавьте/снимите элементы, покажите работу.
2Очередь на связном спискеАналогично — через односвязный список, продемонстрируйте работу.
3ПояснениеОтчёт: сравните структуру и работу массивного и списочного подходов.

  1. Чем отличается стек от очереди с точки зрения управления доступом?
  2. Назовите ситуации, где стек предпочтительнее очереди, и наоборот.
  3. Какие проблемы могут возникнуть при работе с массивами для этих структур?
  4. Как изменяется сложность операций при работе с динамическими структурами?
  5. В чём суть принципов LIFO и FIFO?

Рекомендуемая литература

Section titled “Рекомендуемая литература”