Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры данных ответы на экз.docx
Скачиваний:
0
Добавлен:
13.12.2025
Размер:
45.55 Кб
Скачать
  1. Стек. Организация стека при помощи массива, динамической структуры.

Стек — это упорядоченная структура данных, в которой элементы добавляются и удаляются только с одного конца, называемого вершиной стека. Стек работает по принципу «последним пришёл — первым вышел»

Здесь каждый элемент стека — это отдельный узел, создаваемый в куче. Каждый узел содержит:

1)данные (например, число),

2)ссылку на следующий узел (тот, что лежит ниже в стеке).

3)При добавлении (push) создаётся новый узел, его ссылка указывает на текущий верхний элемент, а сам он становится новой вершиной.

4)При удалении (pop) верхний узел «отцепляется», возвращается его значение, и вершиной становится следующий узел.

5)Данные стека разбросаны по разным участкам оперативной памяти, но связаны ссылками — как в связном списке. Плюс: стек может расти неограниченно (пока есть память), не нужно заранее задавать размер. Минус: чуть больше накладных расходов на хранение ссылок и выделение памяти.

  1. Очередь. Организация очереди при помощи массива. Динамической структуры.Двух стеков.

Очередь — это структура данных, в которой элементы обрабатываются по принципу «первым пришёл — первым вышел» (FIFO: First In – First Out).

1. Очередь через массив

Выделяем обычный массив и заводим два индекса:

  • начало — откуда забираем элементы,

  • конец — куда добавляем новые.

При добавлении — кладём элемент в позицию конец и сдвигаем его вправо.

При удалении — берём элемент из позиции начало и сдвигаем его вправо.

Решение — циклическая (кольцевая) очередь: когда указатель доходит до конца массива, он возвращается в начало, если там есть свободное место. Тогда память используется эффективно.

2. Очередь через динамическую структуру (в куче)

Здесь каждый элемент — это отдельный узел, созданный в куче.

Узел содержит:

  • данные,

  • ссылку на следующий узел.

  • Храним две ссылки:

1)голова — первый элемент (откуда забираем),

2)хвост — последний элемент (куда добавляем).

При добавлении — создаём новый узел, привязываем его к хвосту, и хвост теперь указывает на него.

При удалении — забираем узел из головы, и голова переходит к следующему.

Плюсы:

Очередь может расти неограниченно (пока есть память),

Нет «мертвых зон».

Минус:

Узлы разбросаны по памяти, и каждый занимает немного больше места из-за ссылки.

3. Очередь через два стека

Это интересный способ, который показывает, как одни структуры можно строить на других.

Заводим два стека:

вход — туда кладём новые элементы,

выход — оттуда забираем.

Правило:

При добавлении — просто кладём элемент в стек вход.

При удалении:

Если стек выход не пуст, берём оттуда верхний элемент.

Если выход пуст, перекладываем все элементы из вход в выход (по одному, через pop/push).

При этом порядок разворачивается, и самый старый элемент оказывается сверху в выходе — его и возвращаем.

Так как стек — LIFO, а мы делаем два LIFO подряд, получаем FIFO — то есть очередь.

  1. Деревья. Определения. Высота, степень дерева, степень узла. Бинарные деревья.

Дерево — это иерархическая структура данных, состоящая из узлов (вершин), соединённых рёбрами, в которой:

  • есть ровно один узел без родителя — корень,

  • любой другой узел имеет ровно одного родителя,

  • циклов нет (нельзя пройти по рёбрам и вернуться в тот же узел).

Основные понятия:

Степень узла — это количество его непосредственных потомков (детей).

Например: если у узла три ребёнка, его степень = 3.

Степень дерева — это максимальная степень среди всех его узлов.

То есть: смотрим на все узлы, находим у кого больше всего детей — это и есть степень всего дерева.

Высота дерева — это количество рёбер в самом длинном пути от корня до листа.