Лабораторная работа № 2. Стек и очередь
Перед началом работы, скачайте по ссылке файл ds.py с реализацией необходимых структур данных. Скачайте файл с заданиями, выполняемыми без компьютера.
Теоретические сведения
Тип данных Стек
Стек - это абстрактная структура данных, хранящая элементы, которые можно добавлять или извлекать из одного конца стека. Часть стека в которую помещаются или извлекаются элементы принято называть вершиной стека. Стек работает по принципу “Первым пришёл - последним ушёл”.
Кликните по изображению, чтобы перейти к интерактивной визуализации работы стека.
В лабораторной работе используем собственную реализацию стека на списках. Класс 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(); |
Рассмотрим пример использования методов:
from ds import Queue
q = Queue()
q.enqueue(5)
q.enqueue(8)
q.enqueue(3)
q.dequeue()
q.peek()
q.size()Выполнение кода проиллюстрировано на следующем изображении:
Задания для практической работы
Задания обозначенные значком выполняются на распечатках или в тетради, обозначенные - на компьютере в среде программирования.
Задание 1. Интерфейс абстрактного типа данных «Стек»
Объявлена переменная s встроенного типа Stack. В стеке могут храниться только целые числа. Занесите в таблицу выполняемые инструкции, содержимое стека после выполнения инструкции и значение, которое возвращает инструкция (если таковое есть).
Используйте Таблицу 1, если вам нужна подсказка.
Задание 2. Интерфейс абстрактного типа данных «Очередь»
Объявлена переменная q встроенного типа Queue. Занесите в таблицу выполняемые инструкции, содержимое очереди после выполнения инструкции и значение, которое возвращает инструкция (если таковое есть).
Используйте Таблицу 2, если вам нужна подсказка.
Задание 3. Использование типа данных Stack
Составьте программу, которая позволяет вводить строки, добавляет их в стек и затем выводит строки в обратном порядке. Ввод прекращается после слова “стоп”.
Пример работы программы:
Введите строку: <{один}> ++enter++
Введите строку: <{два}> ++enter++
Введите строку: <{три}> ++enter++
Введите строку: <{четыре}> ++enter++
Введите строку: <{стоп}> ++enter++
Строки в обратном порядке
четыре
три
два
один
Задание 4. Использование типа данных Queue
Пользователь вводит три команды для робота. Команды добавляются в очередь и затем выводятся на экран в порядке ввода с клавиатуры. Вывод продолжается, пока очередь не станет пустой.
Пример работы программы:
Введите команду: <{вверх}> ++enter++
Введите команду: <{вправо}> ++enter++
Введите команду: <{вправо}> ++enter++
Выполнение команд
вверх
вправо
вправо
Задание 5. Из десятичной в двоичную (sam05.py)
Используйте стек для реализации перевода числа X из десятичной системы счисления в двоичную.
Сохраняйте решение этой и последующих программ в одной папке с файлом ds.py. Иначе инструкция импорта не будет работать.
Тестовые данные:
| Ввод | Вывод |
|---|---|
42 |
101010 |
73 |
1001001 |
255 |
11111111 |
0 |
"" (пустая строка) |
Задание 6. Баланс скобок (sam06.py)
Опишите функцию balance(S), которая определяет сбалансированно ли расставлены круглые скобки в строке S.
Используйте следующий шаблон:
Задание 7* (sam07.py)
Решите задачу вашего варианта.
С помощью стека реализуйте историю посещения сайтов в браузере. Пользователь вводит адреса сайтов до ввода слова "выход". Если было введено слово "назад" из стека извлекается адрес ранее посещённого сайта и выводится на экран.
Пример работы программы:
Адрес: <{adu.by}> ++enter++
Адрес: <{bspu.by}> ++enter++
Адрес: <{google.com}> ++enter++
Адрес: <{назад}> ++enter++
google.com
Адрес: <{назад}> ++enter++
bspu.by
Адрес: <{выход}> ++enter++Робот получает последовательность из двух команд - "влево или "вправо". Команды вводятся с клавиатуры до слова "старт". После этого робот начинает выводить команды на экран в обратном порядке, при этом направление поворотов меняется на противоположное: "влево меняется на "вправо" и наоборот. Используйте стек для решения задачи.
Пример работы программы:
Команда: <{влево}> ++enter++
Команда: <{влево}> ++enter++
Команда: <{вправо}> ++enter++
Команда: <{старт}> ++enter++
Команды в обратном порядке:
влево
вправо
вправоС помощью структуры данных Очередь изобразите работу очереди печати. Пользователь вводит с клавиатуры названия файлов, предназначенных для печати до ввода слова "печать". По чистому совпадению, количество страниц в документах равно длине их имён. Выведите документы в порядке их печати и посчитайте общее количество напечатанных страниц. Вывод имён документов начинайте после сообщения "Начало печати".
Пример работы программы:
Документ: <{реферат}> ++enter++
Документ: <{бланк}> ++enter++
Документ: <{акт}> ++enter++
Документ: <{печать}> ++enter++
Начало печати
реферат
бланк
акт
Всего страниц: 15Робот может двигаться вверх и вниз на заданное количество сантиметров. Положительное значение - движение вверх, отрицательное - вниз. Сохраняйте в очереди числа - значения высот. После числа 0 ввод высот останавливается. После сообщения "Начало работы" выведите команды в формате, который показан в примере:
Высота: <{20}> ++enter++
Высота <{-5}> ++enter++
Высота <{-10}> ++enter++
Высота <{0}> ++enter++
Начало работы
вверх на 20 см
вниз на 5 см
вниз на 10 смС помощью стека реализуйте перемещение по каталогам на компьютере. Пользователь вводит названия папок до ввода слова "exit". Если была введена комбинация символов "cd .." из стека извлекается название предыдущего каталога и выводится на экран.
Пример работы программы:
> <{документы}> ++enter++
> <{курсовые}> ++enter++
> <{2026}> ++enter++
> <{cd}> .. ++enter++
2026
> <{cd}> .. ++enter++
курсовые
> <{quit}> ++enter++В очереди сохраняются названия запланированных на день задач. Ввод названий прекращается после слова "начать". Выведите последовательность задач из очереди, длина названия которых превышает 10 символов.
Пример работы программы:
Задача: <{конспект урока}> ++enter++
Задача: <{реферат}> ++enter++
Задача: <{контрольная работа}> ++enter++
Задача: <{начать}> ++enter++
Список дел:
конспект урока
контрольная работаТовары складываются в грузовик и могут быть выгружены из него только в обратном порядке. Используйте стек для хранения порядка погрузки товаров. С клавиатуры вводятся названия товаров. Ввод останавливается после ввода слова "пуск". По чистой случайности, вес товара (в килограммах) совпадает с количеством букв в его названии. Выведите на экран порядок разгрузки товаров и общий вес перевозимых товаров.
Пример работы программы:
Товар: <{яблоки}> ++enter++
Товар: <{картошка}> ++enter++
Товар: <{сок}> ++enter++
Товар: <{пуск}> ++enter++
Товары:
сок
картошка
яблоки
Общий вес: 17 кгС помощью стека реализуйте историю посещения сайтов в браузере. Пользователь вводит адреса сайтов до ввода слова "выход". Если было введено слово "назад" из стека извлекается адрес ранее посещённого сайта и выводится на экран.
Пример работы программы:
Адрес: <{adu.by}> ++enter++
Адрес: <{bspu.by}> ++enter++
Адрес: <{google.com}> ++enter++
Адрес: <{назад}> ++enter++
google.com
Адрес: <{назад}> ++enter++
bspu.by
Адрес: <{выход}> ++enter++Робот получает последовательность из двух команд - "влево или "вправо". Команды вводятся с клавиатуры до слова "старт". После этого робот начинает выводить команды на экран в обратном порядке, при этом направление поворотов меняется на противоположное: "влево меняется на "вправо" и наоборот. Используйте стек для решения задачи.
Пример работы программы:
Команда: <{влево}> ++enter++
Команда: <{влево}> ++enter++
Команда: <{вправо}> ++enter++
Команда: <{старт}> ++enter++
Команды в обратном порядке:
влево
вправо
вправоС помощью структуры данных Очередь изобразите работу очереди печати. Пользователь вводит с клавиатуры названия файлов, предназначенных для печати до ввода слова "печать". По чистому совпадению, количество страниц в документах равно длине их имён. Выведите документы в порядке их печати и посчитайте общее количество напечатанных страниц. Вывод имён документов начинайте после сообщения "Начало печати".
Пример работы программы:
Документ: <{реферат}> ++enter++
Документ: <{бланк}> ++enter++
Документ: <{акт}> ++enter++
Документ: <{печать}> ++enter++
Начало печати
реферат
бланк
акт
Всего страниц: 15Робот может двигаться вверх и вниз на заданное количество сантиметров. Положительное значение - движение вверх, отрицательное - вниз. Сохраняйте в очереди числа - значения высот. После числа 0 ввод высот останавливается. После сообщения "Начало работы" выведите команды в формате, который показан в примере:
Высота: <{20}> ++enter++
Высота <{-5}> ++enter++
Высота <{-10}> ++enter++
Высота <{0}> ++enter++
Начало работы
вверх на 20 см
вниз на 5 см
вниз на 10 смС помощью стека реализуйте перемещение по каталогам на компьютере. Пользователь вводит названия папок до ввода слова "exit". Если была введена комбинация символов "cd .." из стека извлекается название предыдущего каталога и выводится на экран.
Пример работы программы:
> <{документы}> ++enter++
> <{курсовые}> ++enter++
> <{2026}> ++enter++
> <{cd}> .. ++enter++
2026
> <{cd}> .. ++enter++
курсовые
> <{quit}> ++enter++В очереди сохраняются названия запланированных на день задач. Ввод названий прекращается после слова "начать". Выведите последовательность задач из очереди, длина названия которых превышает 10 символов.
Пример работы программы:
Задача: <{конспект урока}> ++enter++
Задача: <{реферат}> ++enter++
Задача: <{контрольная работа}> ++enter++
Задача: <{начать}> ++enter++
Список дел:
конспект урока
контрольная работаТовары складываются в грузовик и могут быть выгружены из него только в обратном порядке. Используйте стек для хранения порядка погрузки товаров. С клавиатуры вводятся названия товаров. Ввод останавливается после ввода слова "пуск". По чистой случайности, вес товара (в килограммах) совпадает с количеством букв в его названии. Выведите на экран порядок разгрузки товаров и общий вес перевозимых товаров.
Пример работы программы:
Товар: <{яблоки}> ++enter++
Товар: <{картошка}> ++enter++
Товар: <{сок}> ++enter++
Товар: <{пуск}> ++enter++
Товары:
сок
картошка
яблоки
Общий вес: 17 кг






