- •СТРУКТУРЫ ДАННЫХ И АЛГОРИТМЫ
- •Глава 1 Линейные списки
- •Понятие структуры данных
- •Тип указатель
- •Линейный список
- •Линейный однонаправленный (односвязный) список
- •Линейный двунаправленный (двусвязный) список
- •Практическое задание «Линейные списки»
- •Задачи для самостоятельной работы
- •Контрольные вопросы
- •Глава 2 Структуры данных стек и очередь
- •Понятие структуры данных стек и очередь
- •Структура данных стек
- •Структура данных очередь
- •Пример решения задачи с использованием стека
- •Практическое задание «Стеки и очереди»
- •Задачи для самостоятельной работы
- •Контрольные вопросы
- •Глава 3 Древовидные структуры данных
- •Понятие структуры данных дерево
- •Представление структуры бинарное дерево в памяти
- •Обход дерева
- •Основные операции над деревом
- •Ввод дерева
- •Практическое задание «Бинарные деревья»
- •Задачи для самостоятельной работы
- •Контрольные вопросы
- •Глава 4 Структура данных таблица
- •Понятие структуры данных таблица
- •Представление таблицы в памяти
- •Организация хеш-таблиц
- •Выбор функции расстановки
- •Разрешение коллизии
- •Операции над таблицами
- •Практическое задание «Управление таблицами»
- •Задачи для самостоятельной работы
- •Контрольные вопросы
- •Глава 5 Алгоритмы упорядочения данных
- •Понятие операции упорядочения
- •Алгоритмы упорядочения
- •Сортировка слиянием
- •Основные алгоритмы сортировки посредством сравнений
- •Улучшенные алгоритмы сортировки сравнением
- •Практическое задание «Алгоритмы сортировки»
- •Задачи для самостоятельной работы
- •Контрольные вопросы
- •Библиографический список
Написать программу, демонстрирующую выполнение операций над заданной структурой данных. Эту программу надо поместить в свой модуль (файл). Модуль с основными операциями включать в программу, используя директиву 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
