
- •Структуры и алгоритмы обработки данных
- •Алгоритмы. Основные определения
- •От задачи к программе
- •Написание программы.
- •Типы данных, структуры данных и абстрактные типы данных
- •Указатели и курсоры
- •Время выполнения программ
- •Измерение времени выполнения программы
- •Степень (порядок) роста
- •Вычисление времени выполнения программ
- •Линейные абстрактные типы данных атд «Список»
- •Реализация списков посредством массивов
- •Реализация списков с помощью указателей
- •Атд «Стек»
- •Атд «Очередь»
- •Реализация очередей с помощью циклических массивов
- •Нелинейные абстрактные типы данных Деревья
- •Порядок узлов
- •Прямой, обратный и симметричный обходы дерева
- •Помеченные деревья и деревья выражений
- •Представление деревьев с помощью массивов
- •Специальные виды множеств атд “Дерево двоичного поиска”
- •Атд "Словарь", основанный
- •Представление ориентированных графов
- •Атд для ориентированных графов
- •Задача нахождения кратчайшего пути
- •Int **c, // массив стоимостей
- •Int *d) // массив кратчайших
- •Остовные деревья минимальной стоимости
- •Обход графов
- •Поиск в ширину
- •Поиск в глубину
- •Сортировка
- •Простые схемы сортировки Метод «пузырька»
- •Сортировка вставками
- •Быстрая сортировка
- •Пирамидальная сортировка
- •«Карманная» сортировка
- •Порядковые статистики
- •Методы разработки алгоритмов. Типы алгоритмов
- •Алгоритмы «разделяй и властвуй» (метод декомпозиции)
- •Баланс подзадач
- •Динамическое программирование
- •Перемножение нескольких матриц
- •Шаг 1: строение оптимальной расстановки скобок
- •Шаг 2: рекуррентное соотношение
- •Шаг 3: вычисление оптимальной стоимости
- •Void MatrixChainOrder(int n, // кол-во матриц
- •Int p[], // размеры матриц
- •Int **s) // оптимальное k
- •Шаг 4: построение оптимального решения
- •Int **s, // таблица, полученная
- •Int I, // индексы
- •Когда применимо динамическое программирование?
- •Оптимальность для подзадач
- •Перекрывающиеся подзадачи
- •«Жадные» алгоритмы
- •"Жадные" алгоритмы как эвристики
- •Когда применим жадный алгоритм?
- •Принцип жадного выбора
- •Оптимальность для подзадач
- •Поиск с возвратом
- •Функции выигрыша
- •Метод ветвей и границ
- •Структуры данных и алгоритмы для внешней памяти
- •Внешняя сортировка
- •Хранение данных в файлах
- •Простая организация данных
- •Хешированные файлы
- •Индексированные файлы
- •Содержание
- •Глава I. Линейные абстрактные типы данных 31
- •Глава II. Сортировка 108
Атд «Стек»
Стек – это специальный тип списка, в котором все вставки и удаления выполняются только на одном конце, называемом вершиной.
Стеки также иногда называют «магазинами», а в англоязычной литературе для обозначения стеков еще используется аббревиатура LIFO (last –in-first-out последний вошел - первый вышел).
Примером стека может служить стопка тарелок в буфете. Взять проще всего верхнюю и положить удобнее наверх.
Стеки часто применяются при реализации операций над текстовыми строками.
АТД семейства «Стек» обычно используют 5 операторов:
-
MAKENULL(S). Делает стек пустым.
-
TOP(S). Возвращает элемент из вершины стека.
-
POP(S). Удаляет элемент из вершины стека. Иногда этот оператор реализуется в виде функции, возвращающей удаляемый элемент.
-
PUSH(x,S). Вставляет элемент х в вершину стека. Элемент, находившийся ранее в вершине стека, становится элементом, следующим за вершиной.
-
EMPTY(S). Эта функция возвращает значение true, если стек пустой и false в противном случае.
Поскольку стеки являются частным случаем списков, то реализуются они на практике также как и списки. Однако при их реализации с помощью массивов удобно зафиксировать дно стека (его самый нижний элемент) в самом низу массива (в ячейке с наибольшим индексом) и позволить стеку расти вверх массива (к ячейке с наименьшим индексом). Переменная с именем top будет указывать положение текущей позиции первого элемента стека.
element
-
1
2
3
4
5
6
7
8
9
10
Атд «Очередь»
Очередь – другой специальный тип списка, в котором элементы вставляются с одного конца, называемого задним, а удаляются с другого, переднего. Очереди также называют «списками типа FIFO» (first-in-first-out, первым вошел – первым вышел). Операторы, выполняемые над очередями аналогичны операторам стеков. Существенное отличие между ними состоит в том, что вставка новых элементов осуществляется в конец списка, а не в начало, как в стеках.
Как и для стеков, любая реализация списков допустима для представления очередей. Однако, учитывая особенность очереди (вставка новых элементов только с одного, заднего конца), можно реализовать оператор вставки более эффективно, чем при обычном представлении списков. Вместо перемещения списка от начала к концу каждый раз при пополнении очереди мы можем хранить указатель (или курсор) на последний элемент очереди.
Т
огда
пустая очередь, и операции вставки и
удаления будут выглядеть так: