Задачи для самостоятельного решения
Однажды Монпертюи, развалившись в кресле и позевывая, сказал: "С каким удовольствием я занялся бы сейчас решением красивой и не очень трудной задачи!". В этих словах - весь человек. Себастьен Шамфор. Характеры и анекдоты 6.1. Пусть L обозначает кольцевой однонаправленный список с удаленным заглавным звеном. Определить, является ли кольцо пустым. 6.2. Разработать функцию для подсчета количества звеньев в заданном кольцевом списке с удаленным заглавным звеном. 6.3. Пусть L обозначает кольцевой однонаправленный список с удаленным заглавным звеном. Написать функцию, которая подсчитывает количество элементов списка L, у которых равные "соседи". 6.4. Пусть L обозначает кольцевой однонаправленный список с удаленным заглавным звеном. Написать функцию, выводящую на экран дисплея элементы списка L в обратном порядке. 6.5. Пусть L обозначает кольцевой однонаправленный список с удаленным заглавным звеном. Написать функцию удаления из списка L первого звена, содержащего отрицательный элемент (если такое звено найдется). 6.6. Пусть L обозначает кольцевой однонаправленный список с удаленным заглавным звеном. Написать функцию, которая в "конец" кольца добавляла бы все его звенья, располагая их в обратном порядке (например, по кольцу, содержащему целые числа 1,2,3, требуется построить кольцо, содержащее числа 1,2,3,3,2,1). 6.7. Пусть L обозначает кольцевой однонаправленный список с удаленным заглавным звеном. Определить, есть ли в списке L хотя бы одно звено, содержащее элемент, равный элементу следующего за ним звена. 6.8. Предположим, что уже построен кольцевой однонаправленный список с удаленным заглавным звеном, элементами которого являются стpоки. Написать программу, подсчитывающую количество строк в кольце, которые начинаются и оканчиваются одним и тем же символом.
6.9. Предположим, что уже построен и задан указателем P кольцевой однонаправленный список с удаленным заглавным звеном, элементами которого являются целые числа. Написать программу, которая находит минимальное значение элементов кольца и номер первого звена, содержащего элемент с этим значением. 6.10. "Считалка". N ребят располагаются по кругу. Начав отсчет от первого, удаляют каждого k-го, смыкая круг после каждого удаления. Определить порядок удаления ребят из круга. Решение этой задачи описать в виде программы, которая должна вывести на экран номера ребят в том порядке, в каком они удаляются из круга. 6.11. Предположим, что уже построены два однонаправленных кольца с удаленным заглавным звеном, элементами которых являются целые числа. Написать функцию, которая определяет, является ли содержимое данного кольца "перевертышем" содержимого другого кольца. 6.12. Пусть L обозначает кольцевой однонаправленный список с включенным заглавным звеном. Определить, является ли кольцо пустым. 6.13. Разработать функцию для подсчета количества звеньев в заданном кольцевом списке с включенным заглавным звеном. 6.14. Пусть L обозначает кольцевой однонаправленный список с включенным заглавным звеном. Написать функцию, которая подсчитывает количество элементов списка L, у которых равные "соседи". 6.15. Пусть L обозначает кольцевой однонаправленный список с включенным заглавным звеном. Написать функцию, выводящую на экран дисплея элементы списка L в обратном порядке. 6.16. Пусть L обозначает кольцевой однонаправленный список с включенным заглавным звеном. Написать функцию удаления из списка L первого звена, содержащего отрицательный элемент (если такое звено найдется).
6.17. Пусть L обозначает кольцевой однонаправленный список с включенным заглавным звеном. Написать функцию, которая в "конец" кольца добавляла бы все его звенья, располагая их в обратном порядке (например, по кольцу, содержащему целые числа 1,2,3, требуется построить кольцо, содержащее числа 1,2,3,3,2,1). 6.18. Пусть L обозначает кольцевой однонаправленный список с включенным заглавным звеном. Определить, есть ли в списке L хотя бы одно звено, содержащее элемент, равный элементу следующего за ним звена. 6.19. Предположим, что уже построен кольцевой однонаправленный список с включенным заглавным звеном, элементами которого являются стpоки. Написать программу, подсчитывающую количество строк в кольце, которые начинаются и оканчиваются одним и тем же символом. 6.20. Предположим, что уже построен и задан указателем P кольцевой однонаправленный список с включенным заглавным звеном, элементами которого являются целые числа. Написать программу, которая находит минимальное значение элементов кольца и номер первого звена, содержащего элемент с этим значением. 6.21. Предположим, что уже построены два однонаправленных кольца с включенным заглавным звеном, элементами которых являются целые числа. Написать функцию, которая определяет, является ли содержимое данного кольца "перевертышем" содержимого другого кольца.
Стеки на базе однонаправленных списков А люди все роптали и роптали, А люди справедливости хотят: Мы в очереди первые стояли, А сзади нас, - уже едят. В.Высоцкий Перед решением задач данного раздела нужно повторить следующий теоретический материал: 1) информационная модель стека на базе линейного однонаправленного списка; 2) построение стека; 3) включение звена в стек; 4) удаление звена из стека. Задачи для самостоятельного решения Вопрос о том, как мне надлежит начать рассказ, старался я решить двумя способами. Во-первых, я почесал в голове; это не привело ни к чему. Во-вторых, посоветовался с моей дочерью Пенелопой, которая и подала мне совершенно новую мысль. Уилки Коллинз. Лунный камень При работе со стеками необходимо уметь составлять функции, реализующие операции: 1) формирование стека;
2) помещение элемента в стек; 3) удаление элемента из стека. Построение 9.1. Напишите функцию формирования стека, причем учтите, что стек может содержать не более K звеньев (переполнение стека) и не может быть пустой (опустошение стека). 9.2. Дан текстовый файл t. Напечатать его содержимое, выписывая литеры каждой его строки в обратном порядке. 9.3. Предположим, что уже построен стек, элементами которого являются массивы символов, которые будем называть словами. Сформировать новый стек, содержащий в качестве элементов "перевертыши" слов из исходного стека. 9.4. Дан файл, элементами которого являются целые числа, упорядоченные по возрастанию (убыванию). При помощи структуры данных стек провести "обратную" сортировку файла по убыванию (возрастанию!). 9.5. Дан файл, элементами которого являются целые числа, упорядоченные по убыванию. Написать программу, разбивающую файл f на два файла, элементы которых упорядочены по возрастанию так, чтобы каждый элемент 1-го файла (a1), был больше соответствующего элемента 2-го файла (b1), но меньше его следующего элемента (b2): b1<a1<b2. 9.6. Исполнитель "Стековый калькулятор" [31] имеет следующую систему предписаний: · начать работу; · добавить <вх: число> в стек; · сложить/вычесть/умножить/разделить; · показать результат; · кончить работу. Запись "добавить <вх: число> в стек" означает, что это предписание имеет один входной объект (входной параметр), который является числом. Исполнитель "Стековый калькулятор" имеет два глобальных объекта: стек чисел (то есть стек, элементами которого являются числа) и табло, на котором по предписанию "показать результат" изображается вершина стека (сам стек при этом не меняется). После вызова предписания "начать работу" стек калькулятора пуст, а на табло ничего не изображено. Предписание "добавить <вх: число> в стек" добавляет указанное при вызове число в стек. Предписание "показать результат" изображает на табло вершину стека. После этого табло не меняется до следующего вызова предписания "показать результат". При выполнении арифметических операций (сложить, вычесть, умножить, разделить) стековый калькулятор достает из стека последовательно сначала правый, а затем левый аргументы операции, выполняет операцию и полученный результат помещает в стек.
При выполнении любой арифметической операции число элементов в стеке уменьшается на 1. Попытки выполнить операцию, когда в стеке меньше двух элементов, или показать результат, когда стек пуст, приводят к отказу. Промоделировать работу исполнителя. 9.7. Исполнитель "Стек элементов типа E" [31] имеет следующую систему предписаний:
Предписания "стек пуст" / "стек не пуст" вырабатывают в качестве ответа значение "да" или "нет". Запись::E в предписании "вершина стека" означает, что это предписание в зависимости от использования либо принимает, либо вырабатывает значение типа E (то есть его можно использовать как в правой, так и в левой части предписания присваивания). Промоделировать работу исполнителя. 9.8. Реализуйте стек стеков со следующими операциями [38]:
9.9. Реализуйте следующие операции для стека очередей [38]:
9.10. Реализуйте следующие операции для очереди стеков [38]:
9.11. Операции над стеком s:
Реализуйте стек [38]. 9.12. Напишите подпрограммы pop, push, empty для стеков, содержащих символьные строки. Заметьте, что если в программе имеются два независимых стека - один для целых чисел и другой для символьных строк, то в ней должны присутствовать две версии подпрограмм pop, push, empty [38].
9.13. Реализовать следующие операции [38]:
· pushandtest(overflow,s,i), которая проверяет стек на переполнение и в случае его отсутствия помещает элемент i в стек s. Модификация 9.14. Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, которая добавляет в конец стека S элемент, находящийся в его вершине. 9.15. Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, которая добавляет в вершину стека S элемент, находящийся в его конце. 9.16. Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, которая удаляет из стека все элементы, кратные 4 (использовать для промежуточного хранения элементов стека однонаправленный список с заглавным звеном). 9.17. Записать элементы стека в другой стек в обратном порядке. 9.18. При помощи операций push, pop, stacktop и empty реализуйте следующие операции [38]: · установить в i второй элемент стека, считая от его вершины, удалив из него два верхних элемента; · установить в i второй элемент стека, считая от его вершины, оставив содержимое стека без изменения; · для заданного n установить в i n-й элемент стека, считая от его вершины, и удалить из стека верхние n элементов; · для заданного n установить в i n-й элемент стека, считая от его вершины, оставив содержимое стека без изменения; · установить в i нижний элемент стека и удалить из него все элементы; · установить в i нижний элемент стека, оставив содержимое стека без изменения; Указание. Используйте вспомогательный стек. · установить в i третий элемент стека, считая от его "дна". 9.19. Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, которая удаляет из стека все элементы, кратные 5 (использовать для промежуточного хранения элементов стека однонаправленный список без заглавного звена). 9.20. Напишите программу, вычисляющую выражение, записанное в постфиксной форме. Предикаты 9.21. Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, проверяющую, является ли стек пустым. 9.22. Напишите алгоритм, определяющий, имеет ли вводимая символьная строка вид xCy, где: · C - символ-разделитель, · x - строка, состоящая из букв A и B, · y - строка, обратная строке x (то есть если x=ABABBA, то y должен равняться ABBABA). При чтении можно считывать только каждый следующий символ строки [38]. 9.23. Напишите алгоритм, определяющий, имеет ли вводимая символьная строка следующую форму: a D b D c D... D z, где каждая строка a, b, c,..., z имеет форму строки, определенной в задаче 9.22. Следовательно, строка имеет правильную форму, если она состоит из любого числа подобных строк, разделенных символом "D". При чтении можно считывать только каждый следующий символ строки [38]. 9.24. В строке, признаком конца которой является первая по порядку точка, могут содержаться круглые, квадратные и фигурные скобки как открывающие, так и закрывающие. Требуется проверить баланс скобок в строке. Баланс скобок соблюдается, если выполнено каждое из следующих условий: · для каждой открывающей скобки справа от нее есть соответствующая закрывающая скобка и наоборот; · соответствующие пары скобок (открывающие и закрывающие) разных типов правильно вложены друг в друга. 9.25. Для заданной последовательности операций pop и push, а также целого числа, задающего размер массива, используемого под стек, создайте алгоритм, регистрирующий возникновение ситуации переполнения [38]. Подсчет 9.26. Сколько в стеке целых чисел, кратных 5, но не кратных 7? 9.27. Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, которая находит сумму элементов, находящихся в стеке. 9.28. Подсчитать количество отрицательных элементов в стеке. 9.29. Сколько в стеке простых чисел? 9.30. Найти сумму минимального и максимального из чисел, находящихся в стеке. Разные задачи 9.31. Представим себе вычислительную машину, в которой имеются один регистр и шесть инструкций [38]: · LD A - помещает операнд A в регистр; · ST A - помещает содержимое регистра в переменную A; · AD A - прибавляет содержимое переменной A к регистру; · SB A - вычитает содержимое переменной A из регистра; · ML A - умножает содержимое регистра на переменную A; · DV A - делит содержимое регистра на переменную A. Напишите программу, считывающую выражение в постфиксной форме, которое состоит из однобуквенных операндов и операций +, -, * и /. Она должна напечатать последовательность инструкций, необходимых для вычисления выражения, и оставить результат в регистре. Используйте переменные в виде Tn в качестве временных. Например, постфиксное выражение ABC*+DE-/ даст такую распечатку инструкций:
9.32. Предположим, что операторы FOR имеют следующий формат: ## FOR var=init TO final STEP step, где ## - номер строки; var - идентификатор языка BASIC, а init, final и step - либо целые числа, либо идентификаторы языка BASIC. Предполагается, что значение step положительно. Напишите программу, которая считывает входные данные, состоящие из таких операторов FOR и операторов NEXT, и переводит их в операторы присваивания, операторы IF и операторы GOTO. Например, входной набор данных:
Указание. Воспользуйтесь стеками для переменных, номеров строк и приращений [38]. 9.33. Фирма XYZ по хранению и сбыту бытовых инструментов и приспособлений получает грузы с оборудованием по различным ценам. Фирма продает их затем с 20%-ной надбавкой, причем товары, полученные позднее, продаются в первую очередь (поскольку товары, получаемые позднее, стоят дороже - стратегия "последний полученный первым продается"). Напишите программу, считывающую записи о торговых операциях двух типов: операции по закупке и операции по продаже. Запись о продаже содержит префикс "S" и количество товара, а также стоимость данной партии. Запись о закупке содержит префикс "R", количество товара, стоимость одного изделия и общую стоимость всей партии. После считывания записи об операции продажи напечатайте ее и сообщение о цене, по которой были проданы изделия. Например, если фирмой были проданы 200 единиц оборудования, в которые входили 50 единиц с закупочной ценой 1.25$, 100 единиц с закупочной ценой 1.1$ и 50 единиц с закупочной ценой 1.00$, то напечатается (вспомните о 20%-ной надбавке): ФИРМА XYZ ПРОДАЛА 200 ИЗДЕЛИЙ 50 ШТУК ПО 1.50 ДОЛЛАРОВ КАЖДЫЙ НА СУММУ: 75.00 100 ШТУК ПО 1.32 ДОЛЛАРОВ КАЖДЫЙ НА СУММУ: 132.00 50 ШТУК ПО 1.20 ДОЛЛАРОВ КАЖДЫЙ НА СУММУ: 60.00 ВСЕГО ПРОДАНО НА СУММУ: 267.00 Если на складе отсутствует требуемое в заказе число изделий, то продайте все имеющиеся, а затем напечатайте: ОСТАЛЬНОЙ ЧАСТИ ИЗДЕЛИЙ XXX НЕТ НА СКЛАДЕ [38]. 9.34. Гаражная стоянка имеет одну стояночную полосу и может разместить до 10 автомашин. В одном конце полосы имеется единственный въезд и выезд. Если владелец автомашины приходит забрать свой автомобиль, а последний не является ближайшим к выходу, то все машины, загораживающие проезд, удаляются, машина данного владельца выводится со стоянки, а другие машины расставляются в исходном порядке. Напишите программу обработки группы входных строк. Каждая входная строка содержит символ "A" для прибывающей машины и "D" для отъезжающей, а также номер каждой автомашины. Предполагается, что машины прибывают и отъезжают в порядке, заданном входными строками. Программа должна напечатать сообщение при прибытии или отъезде любой машины. При прибытии машины сообщение должно информировать о том, имеется ли место на стоянке. Если места нет, то машина уезжает и на стоянку не принимается. При выезде машины со стоянки сообщение должно содержать число раз, которое машина удалялась со стоянки для обеспечения выезда других автомобилей [38]. 9.35. Проанализируйте язык, в котором среди типов данных отсутствуют массивы, но имеются стеки, т.е. в этом языке разрешена запись: DEFSTACK S. Операции pop, push, empty определены как часть языка. Покажите, каким образом двухмерный массив может быть представлен в этом языке с помощью двух стеков [38]. 9.36. Используя стек, "перевернуть" заданный целочисленный массив. Сложные задачи 9.37. Напишите программу, преобразующую: а) строку в префиксной форме в строку в постфиксной форме; б) строку в постфиксной форме в строку в префиксной форме; в) строку в префиксной форме в строку в инфиксной форме; г) строку в постфиксной форме в строку в инфиксной форме; д) строку в инфиксной форме в строку в постфиксной форме. 9.38. Напишите программу, вычисляющую выражение, записанное в инфиксной форме. Следует воспользоваться двумя стеками - одним для операндов и другим для операторов. Не следует преобразовывать сначала инфиксную строку в постфиксную, и затем вычислять постфиксное выражение, а следует вычислять ее без всякого преобразования 9.39. Напишите программу prefix, считывающую входную строку в инфиксной форме и преобразующую ее в префиксную форму. Предполагается, что строка считывается справа налево, а префиксная строка создается также справа налево. 9.40. Напишите программу, считывающую строку в инфиксной форме и формирующую эквивалентную ей строку в инфиксной форме с удаленными необязательными скобками. Можно ли это сделать без использования стека? 9.41. Напишите программу, которая преобразует входную символьную строку, состоящую из операндов и операций постфиксного выражения, в инфиксную форму со скобками. Например, выражение AB+ должно быть преобразовано в (A+B), а AB+C- должно быть преобразовано в ((A+B)-C).
Двунаправленные списки Фрагмент теории Кто управляет прошлым, тот управляет будущим. Кто управляет настоящим, тот управляет прошлым. Дж.Оруэлл. 1984 Здесь мы рассмотрим лишь двунаправленные списки с заглавным звеном, которые имеют следующую структуру:
Здесь nsp - указатель на заглавное звено двунаправленного списка, ksp - указатель на последнее звено двунаправленного списка. Тип каждого звена списка можно описать так: struct node { int elem;//Информационное поле. node *sled; // Указатель на следующее звено. node *pred; // Указатель на предыдущее звено. }; Приступим к построению алгоритма формирования двунаправленного списка с заглавным звеном. Опишем необходимые переменные: node *nsp; // Указатель на заглавное звено списка. node *ksp; // Указатель на последнее звено списка. node *rsp; // Рабочий указатель для перемещения по списку. Построим заглавное звено:
Построен двунаправленный список с заглавным звеном, содержащий одно звено. Мы предоставляем возможность читателю проделать самостоятельно несколько последующих шагов алгоритма.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|