Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры данных и алгоритмы. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
1 Мб
Скачать

Написать программу, демонстрирующую выполнение операций над заданной структурой данных. Эту программу надо поместить в свой модуль (файл). Модуль с основными операциями включать в программу, используя директиву include.

Задачи для самостоятельной работы

1Для указанных ниже представлений очереди, опишите на C соответствующий тип queue (считая, что все элементы имеют некоторый простой тип) и реализуйте в виде процедуры или функции перечисленные ниже операции над очередью (если операция по тем или иным причинам не может быть выполнена, подпрограмма должна возвратить 1 – в случае переполнения очереди, 2 – в случае исчерпания очереди).

Операции с очередью:

1)Создать пустую очередь (очистить очередь);

2)Проверить, является ли очередь пустой;

3)Добавить элемент в очередь;

4)Взять элемент из очереди.

Представление очереди:

а) Линейный массив с двумя указателями (на начало и на конец очереди). Если указатель на конец очереди достиг конца массива, а в начале очереди есть свободные позиции (очередь псевдополна), то освободившиеся позиции не использовать (вид статической очереди: а);

б) Линейный массив с двумя указателями (на начало и на конец очереди). Если указатель на конец очереди достиг конца массива, а в начале очереди есть свободные позиции (очередь псевдополна), то все элементы очереди сдвинуть в ее начало (вид статической очереди: в);

в) Линейный массив с двумя указателями (на начало и на конец очереди). Если указатель на конец очереди достиг конца

60

массива, а в начале очереди есть свободные позиции (очередь псевдополна), то конец очереди перенести в ее начало (т. е. массив как бы склеивается в кольцо – циклическая очередь, вид статической очереди: г);

г) Линейным односвязным списком с двумя указателями (на начало и на конец очереди, вид динамической очереди: а)

2Для указанных ниже представлений стека, опишите на C соответствующий тип stack (считая, что все элементы имеют некоторый простой тип) и реализуйте в виде процедуры или функции перечисленные ниже операции над стеком (если операция по тем или иным причинам не может быть выполнена, подпрограмма должна возвратить 1 – в случае переполнения стека, 2 – в случае исчерпания стека).

Операции со стеком:

1)Создать пустой стек (очистить стек);

2)Проверить, является ли стек пустым;

3)Добавить элемент в стек;

4)Взять элемент из стека.

Представление стека:

а) Линейный массив с указателем на вершину стека;

б) Линейный односвязный список с указателем на вершину стека.

3Используя очередь, решить следующие задачи:

а) за один просмотр файла (дополнительных файлов не использовать), в котором находится последовательность вещественных чисел, напечатать элементы файла в следующем порядке: сначала все числа, меньшие a, затем все числа из отрезка [a, b], и наконец, все остальные числа, сохраняя исходный взаимный порядок в каждой из этих трех групп;

61

б) содержимое текстового файла f, разделенное на строки, переписать в текстовый файл g, перенося при этом в конец каждой строки все входящие в нее цифры, сохраняя при этом исходный взаимный порядок, как среди цифр, так и среди остальных символов строки;

в) дан список имен (имя не более чем из 6 символов) в группе из n (n 30) человек и матрица, в которой для пары (x, y) стоит 1, если человек по имени y является ребенком человека по имени x, иначе 0. Для заданного имени напечатать имена всех его потомков в следующем порядке: сначала имена всех его детей, затем всех его внуков, затем всех его правнуков и т. д.

4Используя стек решить следующую задачу:

а) содержимое текстового файла разделено на строки. Напечатать символы каждой строки файла в порядке обратном их следованию в строке файла;

б) в текстовом файле записана без ошибок формула следующего вида:

<формула> ::= <цифра> │ M(<формула>,<формула>) │ m(<формула>,<формула>)

<цифра> ::= 0│1│2│3│4│5│6│7│8│9

Здесь М обозначает функцию нахождения наибольшего значения, а m – наименьшего значения. Вычислить алгебраическое значение (как целое значение) данной формулы;

в) в текстовом файле записано без ошибок логическое выражение (ЛВ) в следующей форме:

<ЛВ> ::= t │ f │(!<ЛВ>) │ (<ЛВ>&<ЛВ>) │ (<ЛВ>|<ЛВ>)

Здесь знаки !, &, | обозначают соответственно отрицание, конъюнкцию и дизъюнкцию, а t – значение истина, f – значение ложь. Вычислить логическое значение этого выражения.

62

5 Используя очередь и / или стек и подпрограммы, реализующие операции над ними, решить следующие задачи:

а) в текстовом файле записан текст, сбалансированный по круглым скобкам (если скобки в тексте есть, то каждой закрывающей скобке предшествует открывающая скобка):

<текст> ::= <пусто> │ <элемент><текст> <элемент> ::= <буква> │ <цифра> │ <знак> │ (<текст>) <знак> ::= + │ - │ * │

Для каждой пары соответствующих открывающей и закрывающей скобок напечатать номера их позиций в тексте, упорядочив пары номеров в порядке возрастания номеров позиций закрывающих или открывающих скобок;

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

<текст> ::= <элемент> │ <элемент> <текст>

< элемент > ::= a │b │ (< текст >) │[< текст >] │{< текст >}

в) В текстовом файле F дана последовательность ненулевых целых чисел, оканчивающаяся нулем. Переписать содержимое стандартного файла F в текстовый файл G в следующем порядке: сначала отрицательные числа, затем положительные, сохраняя при этом исходный взаимный порядок следования элементов;

г) В файле F содержится текст, разделенный на строки. Переписать его строки в текстовый файл G, перенося при этом в конец каждой строки все входящие в нее цифры (с сохранением исходного взаимного порядка как среди цифр, так и среди остальных символов строки);

д) В файле F содержится текст, разделенный на строки. Переписать его строки в обратном порядке в текстовый файл G;

63

е) В файле F содержится текст, разделенный на строки длиной не более 50 символов. Задана строка S, содержащая не более 15 символов. Переписать в текстовый файл G те строки исходного файла, которые содержат в качестве фрагмента строку S. Порядок следования строк в новом файле – обратный исходному порядку;

ж) В заданной группе из n людей (n 26) каждый человек обозначен буквой латинского алфавита. Также даны имя L и матрица D родственных связей между этими людьми. Элемент матрицы D[x, y] = 1, если человек по имени y является ребенком человека по имени x. Записать в файл имена потомков человека с именем L в следующем порядке: сначала имена всех его детей, затем всех его внуков, затем всех правнуков и т. д. Потомков каждого уровня записать в файл отдельной строкой;

з) В текстовом файле дана последовательность ненулевых целых чисел, оканчивающаяся нулем. По заданной последовательности вычислить значение выражения:

n x1 + (n - 1) x2 + ... + 2 xn – 1 + xn,

где n – количество положительных чисел в последовательности, xi > 0, x1 – первое положительное число в файле, x2 – второе положительное число в файле и т. д., xn – последнее положительное число в файле;

и) В текстовом файле записана без ошибок формула следующего вида:

<формула> ::= <терминал> │ ( <формула> < знак> <формула>)

<терминал> ::= 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 <знак> ::= + │ - │ * │ /

Вычислить значение формулы, считая, что в формуле деление на нуль не встречается, а ее результат не выходит за диапазон значений целого типа.

64

к) В текстовом файле записана без ошибок формула следующего вида:

<формула> ::= 0│1│ ( <формула> & <формула>) │ ( <формула> | <формула>)

Вычислить значение формулы, если & означает операцию конъюнкции, а | – дизъюнкции;

л) Дана колода из n игральных карт (n 50). Сначала перетасовать колоду карт по правилу: верхняя карта кладется в первую кучку, а нижняя карта – во вторую, и так пока все карты не будут распределены. После этого соединить карты в колоду по правилу: сначала брать одну карту из первой кучки, потом одну карту из второй, и так пока все карты не будут помещены в колоду;

м) В текстовом файле записано без ошибок арифметическое выражение (АВ) в следующей форме:

<АВ> ::= <цифра> │ (<АВ> + <АВ>) │ (<АВ> − <АВ>) │ (<АВ> * <АВ>)

<цифра> ::= 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9

Вычислить значение этого арифметического выражения;

н) В текстовом файле записано без ошибок арифметическое выражение (АВ) в следующей форме:

<АВ> ::= <операнд> │ (<АВ> + <АВ>) │ (<АВ> − <АВ>) │ (<АВ> * <АВ>)

<операнд> ::= <цифра> │ <буква>

<цифра> ::= 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 <буква> ::= a │ b │ c │ d │ e │ f

Перевести это выражение в постфиксную форму. Постфиксной формой (обратная польская запись) записи выражения a ◊ b (где

65

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