Лабораторная работа № 2. Стек и очередь
Теоретические сведения
Тип данных Стек
Стек - это абстрактная структура данных, хранящая элементы, которые можно добавлять или извлекать из одного конца стека. Часть стека в которую помещаются или извлекаются элементы принято называть вершиной стека. Стек работает по принципу - “Первым пришёл - последним ушёл”.
В лабораторной работе используем собственную реализацию стека на списках. Класс Stack будет храниться в файле ds.py. Чтобы создать новый объект класса Stack необходимо импортировать класс из файла ds.py:
# импорт класса Stack из файла ds.py
from ds import Stack
# создание нового объекта класса Stack
s = Stack()В Таблице 1 перечислены методы класса Stack.
Stack
| Метод/Свойство | Назначение | Пример |
|---|---|---|
push(el) |
Метод добавляет el на вершину стека. |
s.push(4) |
pop() |
Метод удаляет элемент с вершины стека и возвращает его. | t = s.pop(); |
peek() |
Метод возвращает элемент с вершины стека не удаляя его. | t = s.peek(); |
size() |
Метод возвращает количество элементов в стеке. | c = s.size(); |
Тип данных Очередь
Очередь - абстрактная структура данных, элементы в которую добавляются с одного конца а извлекаются из другого. Очередь работает по принципу “Первым пришёл - первым вышел”. У очереди есть начало и конец. Новые элементы добавляются в конец очереди а извлекаются из начала очереди.
В лабораторной работе используем собственную реализацию очереди на списках. Класс Queue будет храниться в файле ds.py. Чтобы создать новый объект класса Queue необходимо импортировать класс из файла ds.py:
В Таблице 2 перечислены методы класса Queue.
Queue
| Метод/Свойство | Назначение | Пример |
|---|---|---|
enqueue(el) |
Метод добавляющий el в конец очереди. |
q.enqueue("doc") |
dequeue() |
Метод удаляет элемент из начала очереди и возвращает его. | t = q.dequeue(); |
peek() |
Метод возвращает элемент из начала очереди но не удаляет его. | t = q.peek(); |
size() |
Метод возвращает количество элементов в очереди. | c = q.size(); |
Задания для практической работы
Задания обозначенные значком 📝 выполняются на распечатках или в тетради, обозначенные 💻 - на компьютере в среде программирования.
📝 Задание 1. Интерфейс абстрактного типа данных «Стек»
Объявлена переменная s встроенного типа Stack. В стеке могут храниться только целые числа. Занесите в таблицу выполняемые инструкции, содержимое стека после выполнения инструкции и значение, которое возвращает инструкция (если таковое есть).
Используйте Таблицу 1, если вам нужна подсказка.
📝 Задание 2. Интерфейс абстрактного типа данных «Очередь»
Объявлена переменная q встроенного типа Queue. Занесите в таблицу выполняемые инструкции, содержимое очереди после выполнения инструкции и значение, которое возвращает инструкция (если таковое есть).
Используйте Таблицу 2, если вам нужна подсказка.
💻 Задание 3. Использование типа данных Stack
Составьте программу, которая позволяет ввести три строки, добавляет их в стек и затем выводит строки в порядке, противоположном вводу.
Пример работы программы:
💻 Задание 4. Использование типа данных Queue
Пользователь вводит три команды для робота. Команды добавляются в очередь и затем выводятся на экран в порядке ввода с клавиатуры.
Пример работы программы:
Введите команду: вверх
Введите команду: вправо
Введите команду: вправо
Выполнение команд
вверх
вправо
вправо
💻 Задание 5. Из десятичной в двоичную (sam05.py)
Используйте стек для реализации перевода числа X из десятичной системы счисления в двоичную.
Сохраняйте решение этой и последующих программ в одной папке с файлом ds.py. Иначе инструкция импорта не будет работать.
Тестовые данные:
| Ввод | Вывод |
|---|---|
42 |
101010 |
73 |
1001001 |
255 |
11111111 |
0 |
"" (пустая строка) |
💻 Задание 6. Баланс скобок (sam06.py)
Опишите функцию balance(S), которая определяет сбалансированно ли расставлены круглые скобки в строке S.
Используйте следующий шаблон:
💻 Задание 7*. Универсальный баланс скобок (sam07.py)
Модифицируйте функцию из задания 6 так, чтобы проверять баланс круглых, прямоугольных и фигурных скобок одновременно.
Тестовые данные:
| Ввод | Вывод |
|---|---|
{({([][])}())} |
True |
[{()] |
False |