Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_ЛР_СДА2012Ukr.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
899 Кб
Скачать
☆

2 Розв’язання задач за допомогою лінійних структур даних

2.1 Мета роботи – Набути навичок розпізнавати необхідність використання класичних лінійних СД під час розв’язання алгоритмічних задач.

2.2 Методичні вказівки з організації самостійної роботи студентів

Класичним прикладом використання списків може служити реалізація АТД стек, черга й дек.

Стек реалізує лінійну послідовність елементів з дисципліною обслуговування LIFO (Last In First Out). Включення й вилучення елементів зі стека виконуються тільки з одного боку, що називається вершиною стека.

Черга – це лінійна послідовність елементів з дисципліною обслуговування FIFO (First In First Out). У черзі включення елементів виконується тільки з однієї сторони списку, а вилучення - з іншої.

Дек – це лінійна послідовність елементів, у якій як включення, так і вилучення елементів може здійснюватися з кожного із двох кінців списку. Дек легше всього представити як два стеки, складених дном один до одного.

Схематично моделі стека, черги й дека наведені на рис. 2.3. Стрілками показані операції додавання й вилучення елементів з послідовності.

Рисунок 2.3 - Моделі а) стека; б) черги в) дека

Неважко самостійно винайти найпростіший спосіб реалізації стека, черги та дека за допомогою одномірного масиву. Перевагою такої реалізації є швидкість реалізації та швидкість виконання базових операцій. Єдиним недоліком такої реалізації є обмеженість числа елементів під час декларації масиву, що призводить до необхідності реалокації пам’яті під всю структур даних у випадку необхідності додавання ще одного елемента у повністью заповнений, наприклад, стек.

Стеки й черги найпоширеніші при реалізації різних моделей взаємодії потоків у багатопотокових програмах, коли один потік підготовляє дані, а інший їх обробляє.

Стеки також часто використовуються для перетворення рекурсивних процедур в ітеративні (реалізація власного механізму рекурсії з необмеженим стеком), а також для реалізації алгоритмів пошуку розв’язання задач з поверненнями (задач штучного інтелекту).

2.3 Варіанти індивідуальних завдань

  1. Игра в пьяницу. В игре в пьяницу карточная колода раздается поровну двум игрокам. Далее они вскрывают по одной верхней карте, и тот, чья карта старше, забирает себе обе вскрытые карты, которые кладутся под низ его колоды. Тот, кто остается без карт – проигрывает. Для простоты будем считать, что все карты различны по номиналу, а также, что самая младшая карта побеждает самую старшую карту ("шестерка берет туза"). Игрок, который забирает себе карты, сначала кладет под низ своей колоды карту первого игрока, затем карту второго игрока (то есть карта второго игрока оказывается внизу колоды). Напишите программу, которая моделирует игру в пьяницу и определяет, кто выигрывает. В игре участвует 10 карт, имеющих значения от 0 до 9, большая карта побеждает меньшую, карта со значением 0 побеждает карту 9.

Формат входных данных Программа получает на вход две строки: первая строка содержит 5 карт первого игрока, вторая – 5 карт второго игрока. Карты перечислены сверху вниз, то есть каждая строка начинается с той карты, которая будет открыта первой.

Формат выходных данных Программа должна определить, кто выигрывает при данной раздаче, и вывести слово first или second, после чего вывести количество ходов, сделанных до выигрыша. Если на протяжении 106 ходов игра не заканчивается, программа должна вывести слово botva.

Пример

Входные данные

1 3 5 7 9

2 4 6 8 0

Выходные данные

second 5

  1. Постфиксная запись. В постфиксной записи (или обратной польской записи) операция записывается после двух операндов. Например, сумма двух чисел A и B записывается как A B +. Запись B C + D * обозначает привычое нам (B + C) * D, а запись A B C + D * + означает A + (B + C) * D. Достоинство постфиксной записи в том, что она не требует скобок и дополнительных соглашений о приоритете операторов для своего чтения.

Более сложный пример: выражению a+b*c /(d-c) соответствует ПОЛИЗ

Полотно 1

Формат входных данных В единственной строке записано выражение в постфиксной записи, содержащее однозначные числа и операции +, -, *.

Формат выходных данных Необходимо вывести значение записанного выражения.

Пример

Входные данные: 8 9 + 1 7 - *

Выходные данные -102

  1. Постфиксная запись - 2. Прочтите задание варианта №1. Переведите заданное последовательностью символов арифметическое выражение (из чисел, операций +,-,*,/ и скобок) в форму польской обратной записи (ПОЛИЗ)

Пример

Входные данные: (8+9)*(1-7)

Выходные данные: 8 9 + 1 7 - *

  1. Постфиксная запись - 3. Прочтите задание варианта №1. Вычислить заданное последовательностью символов арифметическое выражение (из чисел, операций +,-,*,/ и скобок)

Пример

Входные данные: 7-(8+9)*7 -1

Выходные данные: -113

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

Пустая последовательность явлется правильной.

Если A – правильная, то последовательности (A), [A], {A} – правильные.

Если A и B – правильные последовательности, то последовательность AB – правильная.

Формат входных данных. В единственной строке записана скобочная последовательность.

Формат выходных данных. Если данная последовательность правильная, то программа должна вывести строку yes, иначе строку no.

Пример

Входные данные

Выходные данные

([{}])

yes

([)]

no

()()

yes

())(

no

  1. Склад. На складе хранятся контейнеры с товарами N различных видов. Все контейнеры составлены в N стопок. В каждой стопке могут находиться контейнеры с товарами любых видов (стопка может быть изначально пустой). Автопогрузчик может взять верхний контейнер из любой стопки и поставить его сверху в любую стопку. Необходимо расставить все контейнеры с товаром первого вида в первую стопку, второго вида – во вторую стопку и т.д. Программа должна вывести последовательность действий автопогрузчика или сообщение о том, что задача решения не имеет.

Формат входных данных. В первой строке входных данных записано одно натуральное число N, не превосходящее 500. В следующих N строках описаны стопки контейнеров: сначала записано число ki – количество контейнеров в стопке, а затем ki чисел – виды товара в контейнерах в данной стопке, снизу вверх. В каждой стопке вначале не более 500 контейнеров (в процессе переноса контейнеров это ограничение может быть нарушено).

Формат выходных данных. Программа должна вывести описание действий автопогрузчика: для каждого действия напечатать два числа – из какой стопки брать контейнер и в какую стопку класть. (Обратите внимание, что минимизировать количество операций автопогрузчика не требуется.) Если задача не имеет решения, необходимо вывести одно число 0. Если контейнеры изначально правильно размещены по стопкам, то выводить ничего не нужно.

Пример

Входные данные

Выходные данные

3

1 2

4 1 2 3 2

1 3

0

1 2

0

Объяснение примера. Изначально в первой стопке лежат четыре контейнера – снизу контейнер с товаром первого вида, над ним – с товаром второго вида, над ним третьего, и сверху еще один контейнер с товаром второго вида. Вторая и третья стопки – пусты.

  1. Переключение между окнами. Когда пользователь работает в операционной системе Windows, у него часто запущено несколько приложений. Каждое из приложений работает в отдельном окне. Для переключения между окнами используется комбинация клавиш «Alt+Tab». Эта комбинация делает активным окно, в котором пользователь работал перед тем, как перейти в текущее активное окно.

Чтобы переключиться в другое окно, можно нажать клавишу «Alt» и затем, не отпуская ее, несколько раз нажать клавишу «Tab». Чтобы понять, какое окно станет активным после этого, воспользуемся следующей моделью. Пусть запущено n приложений. Приложения в операционной системе организованы в виде списка и упорядочены по убыванию времени последней активности. То есть приложение, окно которого является активным в настоящий момент – первое в списке, приложение, окно которого было активно перед этим – второе, и т. д.

Если нажать клавишу «Alt» и затем, не отпуская ее, нажать клавишу «Tab» k раз, то активным станет окно приложения, которое находится на (k mod n) + 1-м месте в списке. Здесь a mod b означает остаток от деления a на b. Иными словами, операционная система рассматривает список как циклический, переходя после последнего элемента списка к первому.

При запуске нового приложения оно добавляется в начало списка.

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

Формат входных данных. В первой строке вводится целое число n – количество действий пользователя ( 1≤n≤1000). Следующие n строк содержат описание действий пользователя.

Запуск приложения описывается строкой «Run <имя приложения»>. Здесь «<имя приложения»> – строка из не более чем 100 латинских букв, цифр и пробелов. Она отделена от слова «Run» ровно одним пробелом. Все имена приложений различны. Большие и маленькие буквы считаются различными. Переключение между приложениями описывается строкой «Alt+Tab+...+Tab», здесь подстрока «+Tab» повторена в точности столько раз, сколько раз пользователь нажал клавишу «Tab», не отпуская клавишу «Alt». Это количество не превышает 100. Первая команда во входных данных – всегда команда «Run».

Формат выходных данных. Выведите n строк – последовательность имен приложений, с которыми работал пользователь в порядке, в котором их окна становились активными.

Примеры

Входные данные

Выходные данные

6

Run Mozilla Firefox

Run Free Pascal

Alt+Tab

Run Miranda IM

Alt+Tab+Tab

Alt+Tab+Tab+Tab

Mozilla Firefox

Free Pascal

Mozilla Firefox

Miranda IM

Free Pascal

Free Pascal

  1. Максимальное произведение. Дано N целых чисел. Требуется выбрать из них три таких числа, произведение которых максимально.

Формат входных данных. Во входном файле записано сначала число N — количество чисел в последовательности (3≤N≤106). Далее записана сама последовательность: N целых чисел, по модулю не превышающих 30000.

Формат выходных данных. В выходной файл выведите три искомых числа в любом порядке. Если существует несколько различных троек чисел, дающих максимальное произведение, то выведите любую из них.

Примеры

Входные данные

Выходные данные

9

3 5 1 7 9 0 9 -3 10

9 10 9

3

-5 –30000 –12

-5 –30000 -12

  1. С ортировка вагонов. К тупику со стороны пути 1 подъехал поезд. Разрешается отцепить от поезда один или сразу несколько первых вагонов и завезти их в тупик (при желании, можно даже завезти в тупик сразу весь поезд). После этого часть из этих вагонов вывезти в сторону пути 2. После этого можно завезти в тупик еще несколько вагонов и снова часть оказавшихся вагонов вывезти в сторону пути 2. И так далее (так, что каждый вагон может лишь один раз заехать с пути 1 в тупик, а затем один раз выехать из тупика на путь 2). Заезжать в тупик с пути 2 или выезжать из тупика на путь 1 запрещается. Нельзя с пути 1 попасть на путь 2, не заезжая в тупик.

Известно, в каком порядке изначально идут вагоны поезда. Требуется с помощью указанных операций сделать так, чтобы вагоны поезда шли по порядку (сначала первый, потом второй и т.д., считая от головы поезда, едущего по пути 2 в сторону от тупика). Напишите программу, определяющую, можно ли это сделать.

Формат входных данных

Вводится число N — количество вагонов в поезде (1≤N≤100). Дальше идут номера вагонов в порядке от головы поезда, едущего по пути 1 в сторону тупика. Вагоны пронумерованы натуральными числами от 1 до N, каждое из которых встречается ровно один раз.

Формат выходных данных

Если сделать так, чтобы вагоны шли в порядке от 1 до N, считая от головы поезда, когда поезд поедет по пути 2 из тупика, можно, выведите сообщение YES, если это сделать нельзя, выведите NO.

Пример:

Входные данные

Входные данные

Комментарии

3

3 2 1

YES

Надо весь поезд завезти в тупик, а затем целиком вывезти его на 2-й путь.

4

4 1 3 2

YES

Сначала надо в тупик завезти два вагона, один из которых оставит в тупике, а второй — вывезти на 2-й путь, после чего завезти в тупик еще два вагона и вывезти 3 вагона, стоящие в тупике, на 2-й путь

3

2 3 1

NO

 

  1. Цех. Для транспортирования материалов из цеха А в цех В используется конвейер. Материалы упаковываются в одинаковые контейнеры и размещаются на ленте один за одним в порядке изготовления в цехе А. Каждый контейнер имеет степень срочности обработки в цехе В. Для упорядочивания контейнеров по степени срочности используют накопитель, который находится в конце конвейера перед входом в цех В. Накопитель работает пошагово, на каждом шаге возможны следующие действия:

1) накопитель перемещает первый контейнер из ленты в цех В;

2) накопитель перемещает первый контейнер из строки в склад (в складе каждый следующий контейнер помещается на предыдущий);

3) накопитель перемещает верхний контейнер из склада в цех В.

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

Формат входных данных. Входной файл в первой строке содержит количество тестов N. Далее следует N строк, каждый из которых описывает отдельный тест и содержит целое число K (1  K  10000) — количество контейнеров в последовательности и K действительных чисел — степеней срочности контейнеров в порядке их поступления из цеха А (меньшим числам соответствует большая степень срочности).

Формат выходных данных. Каждая строка выходного файла должна содержать ответ для одного теста. Необходимо вывести 1, если необходимое упорядочивание возможно, или 0 в противном случае.

Пример

Входные данные

Выходные данные

2

2 2.9 2.1

3 5.6 9.0 2.0

1

0

  1. Баржа. На барже располагается K грузовых отсеков. В каждый отсек можно поместить некоторое количество бочек с одним из 10 000 видов топлива. Причём извлечь бочку из отсека можно лишь в случае, если все бочки, помещённые в этот отсек после неё, уже были извлечены. Таким образом в каждый момент времени в каждом непустом отсеке имеется ровно одна бочка, которую можно извлечь не трогая остальных. Будем называть такие бочки крайними.

Изначально баржа пуста. Затем она последовательно проплывает через N доков, причём в каждом доке на баржу либо погружается бочка с некоторым видом топлива в некоторый отсек, либо выгружается крайняя бочка из некоторого отсека. Однако, если указанный отсек пуст, либо если выгруженная бочка содержит не тот вид топлива, который ожидалось, следует зафиксировать ошибку. Если на баржу оказывается погружено более P бочек или если после прохождения всех доков она не стала пуста, следует также зафиксировать ошибку. От вас требуется либо указать максимальное количество бочек, которые одновременно пребывали на барже либо зафиксировать ошибку.

Входные данные. В первой строке три целых числа N, K и P (1 ≤ N, K, P ≤ 100 000). Далее следует N строк с описанием действия, выполняемого в очередном доке. Если в нём происходит погрузка, то строка имеет вид «+ A B», где A — номер отсека, в который помещается бочка, а B — номер вида топлива в ней. Если же док занимается разгрузкой, то строка имеет вид «- A B», где A — номер отсека, из которого извлекается бочка, а B — номер ожидаемого вида топлива.

Выходные данные. Вывести либо одно число, равное искомому максимуму в случае безошибочного прохождения баржой маршрута, либо вывести слово «Error» в противном случае.

Пример

Входные данные

Выходные данные

6 1 2 + 1 1 + 1 2 - 1 2 - 1 1 + 1 3 - 1 3

2

  1. На вокзале есть K тупиков, куда прибывают электрички. Этот вокзал является их конечной станцией, поэтому электрички, прибыв, некоторое время стоят на вокзале, а потом отправляются в новый рейс (в ту сторону, откуда прибыли).

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

Тупики пронумерованы числами от 1 до K. Когда электричка прибывает, ее ставят в свободный тупик с минимальным номером. При этом если электричка из какого-то тупика отправилась в момент времени X, то электричку, которая прибывает в момент времени X, в этот тупик ставить нельзя, а электричку, прибывающую в момент X+1 — можно.

Напишите программу, которая по данному расписанию для каждой электрички определит номер тупика, куда прибудет эта электричка.

Формат входных данных. Сначала вводятся число K — количество тупиков и число N — количество электропоездов (1≤K≤100000, 1≤N≤100000). Далее следуют N строк, в каждой из которых записано по 2 числа: время прибытия и время отправления электрички. Время задается натуральным числом, не превышающим 109. Никакие две электрички не прибывают в одно и то же время, но при этом несколько электричек могут отправляться в одно и то же время. Также возможно, что какая-нибудь электричка (или даже несколько) отправляются в момент прибытия какой-нибудь другой электрички. Время отправления каждой электрички строго больше времени ее прибытия. Все электрички упорядочены по времени прибытия. Считается, что в нулевой момент времени все тупики на вокзале свободны.

Формат выходных данных. Выведите N чисел — по одному для каждой электрички: номер тупика, куда прибудет соответствующая электричка. Если тупиков не достаточно для того, чтобы организовать движение электричек согласно расписанию,  выведите два числа: первое должно равняться 0 (нулю), а второе содержать номер первой из электричек, которая не сможет прибыть на вокзал.

Примеры

Входные данные

Выходные данные

1 1 2 5

1

1 2 2 5 5 6

0 2

2 3 1 3 2 6 4 5

1 2 1

2.4 Контрольні запитання і завдання

  1. Які переваги та недоліки реалізації стека та черги за допомогою масива?

  2. Запропонуйте ідею, як реалізувати кільціову чергу на масиві.

  3. Яка лінійна структура даних використовується компілятором для реалізації вкладених викликів функцій?

  4. Запропонуйте ідею, як реалізувати дек за допомогою двох стеків.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]