Лабораторная работа № 9.
Стек, очередь, дек

1. Постановка задачи

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

На основе базовых операций со структурами необходимо разработать следующие подпрограммы:

Для каждой структуры написать две реализации: на основе динамического массива и на основе списка. К основной программе подключать три модуля (для стека, очереди и дека), при этом основная программа не должна меняться при подключении модуля с другой реализацией той же структуры.

При всех операциях соблюдать правила работы с информационно-логическими структурами – доступ осуществляется только к первому и/или последнему элементу структуры. Для вывода и удаления перекладывать элементы структуры в другую аналогичную структуру.

В стек, очередь и дек вводить одни и те же данные (из одного и того же файла)!

Разработать программу, к которой будут подключаться разработанные модули. Программа должна сделать следующее:

После каждого изменения выводить содержимое структур.

Имена файлов передаются через параметры программы.

Создать стек, очередь и дек, содержащие целые числа в диапазоне от -20 до +60. Из стека и очереди удалить все элементы, кратные 5, из дека удалить элементы, кратные 5, если они при этом находятся на одинаковом расстоянии от краёв дека.

2. Таблица данных

2.1. Добавление элемента в стек

Класс Имя Смысл Тип Структура
Входные данные stack Стек TStack составная переменная
info Информация для добавления в стек TInfo составная переменная
Выходные данные stack Тот же стек после добавления информации TStack составная переменная

2.2. Удаление элемента из стека/Удаление из стека указанных элементов

Класс Имя Смысл Тип Структура
Входные данные stack Стек TStack составная переменная
Выходные данные stack Тот же стек после удаления информации TStack составная переменная

2.2. Проверка, что стек пуст

Класс Имя Смысл Тип Структура
Входные данные stack Стек TStack составная переменная
Выходные данные isEmpty Признак отсутствия (true)/наличия (false) элементов в стеке boolean простая переменная

2.3. Ввод элементов стека из текстового файла

Класс Имя Смысл Тип Структура
Входные данные name Имя файла строка простая переменная
Выходные данные stack Стек TStack составная переменная

2.4. Вывод элементов стека на экран

Класс Имя Смысл Тип Структура
Входные данные stack Стек TStack составная переменная

Подпрограммы для очереди и дека будут аналогичны.

3. Аномалии

  1. Недостаточно параметров.
  2. Невозможно открыть файл для чтения.
  3. Некорректные данные в файле.
  4. Значения в текстовом файле не попадают в заданный диапазон – такие значения должны отбрасываться.
  5. Добавляемое значение не попадает в заданный диапазон – такие значения не должны добавляться.

4. Формат представления данных в файле

Целые и вещественные числа обязательно надо разделять либо пробелами, либо переводами строки. Символы либо надо разделять переводами строки – в этом случае следует использовать процедуру readln, либо не разделять ничем – в этом случае следует использовать процедуру read.

5. Тестовые примеры

№ теста Входные данные
(содержимое файла)
Ожидаемые результаты
(после удаления элементов, кратных 5)
Смысл теста
1 2, 3, -51, -7, 16 Стек:    16,  -7,  3,  2
Очередь:  2,   3, -7, 16
Дек:     16,   2,  3, -7
Нет элементов, удовлетворяющих условию.
2 15, 0, 9, 4, 6, 1, 0, 3, 2 Стек:    2, 3, 1, 6,  4, 9
Очередь: 9, 4, 6, 1,  3, 2
Дек:     2, 0, 6, 9, 15, 0, 4, 1, 3
Есть элементы, удовлетворяющие условию.
В деке нет совпадающих пар.
3 0, 2, 2, 5, 5, 8, 8, 10, 15 Стек:    8, 8, 2, 2
Очередь: 2, 2, 8, 8
Дек:     8, 2, 0, 2, 8
Есть элементы, удовлетворяющие условию. Первый и последний элементы удовлетворяют условию.
В деке есть совпадающие пары.
4 -5, 0, 15, -15, 55 Стек:
Очередь:
Дек:     -5
Все элементы удовлетворяют условию. Количество элементов нечётно, поэтому в деке остаётся один элемент.
5 -15, 0, -5, 45 Стек:
Очередь:
Дек:
Все элементы удовлетворяют условию. Количество элементов чётно, поэтому в деке не остаётся элементов.

6. Метод

Берём элемент из стека. Если он не удовлетворяет условию, кладём его в другой стек. Таким образом, выбираем все элементы исходного стека. Когда исходный стек станет пуст, перекладываем элементы из дополнительного стека обратно в исходный.

С очередью поступаем аналогично – перемещаем элементы, не удовлетворяющие условию, из исходной в дополнительную очередь, а потом обратно.

Для обработки дека можно использовать либо одну, либо две дополнительные структуры. Берём по элементу с каждой стороны дека. Если хотя бы один из них не удовлетворяет условию, кладём пару элементов либо в один дополнительный дек с разных сторон, либо в разные дополнительные деки. После освобождения исходного дека, перекладываем элементы обратно. Не забывайте, что в деке может оказаться как чётное, так и нечётное количество элементов.

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