Стеком (англ. stack) называется хранилище данных, в котором можно работать только с одним элементом: тем, который был добавлен в стек последним. Стек должен поддерживать следующие операции:
Стек можно хранить двумя способами: либо массивом некоторого фиксированного размера, либо при помощи ссылочной реализации.
Очередью (aнгл. queue)) называется структура данных, в которой элементы кладутся в конец, а извлекаются из начала. Таким образом, первым из очереди будет извлечен тот элемент, который будет добавлен раньше других.
Деком (англ. deque – аббревиатура от double-ended queue, двухсторонняя очередь) называется структура данных, в которую можно удалять и добавлять элементы как в начало, так и в конец. Дек хранится в памяти так же, как и очередь. Система команд дека:
Списки представляют собой последовательности элементов, в которые можно произвольно вставлять элементы и удалять элементы. Списки реализовываются в виде двусвязных ссылочных структур, поэтому в списках легко перемещаться от одного элемента к следующему и к предыдущему, но нельзя быстро перейти к элементу с заданным номером в списке (как в массиве).
Реализуйте список, элементами которого являются целые числа.
Список состоит из произвольного числа элементов. Один из элементов списка будем называть текущим. Также в качестве текущего элемента может выступать фиктивный элемент, находящийся за последним элементом списка - будем называть его концом списка. Этот фиктивный элемент нужен для того, чтобы можно было добавлять элементы в конец списка.
В самом начале список пустой, а текущим элементом является конец списка.
Список поддерживает следующие операции:
error.
ok или error,
если текущим является конец списка.
end, если текущим элементом стал конец списка, или error,
если текущим элементом уже был конец списка.
error, если текущим элементом был первый элемент списка.
ok.
error,
если текущим был конец списка. Текущим элементом становится элемент, следущий за текущим.
ok.
bye и завершить работу.
| Ввод | Вывод |
|---|---|
insert 1 insert 2 insert 3 next erase get set 4 prev prev erase next next insert 5 prev insert 6 next erase erase get size clear size exit |
ok ok ok 2 2 1 ok 3 error 3 end error ok 4 ok 4 4 5 error 1 ok 0 bye |
Реализуйте бинарное дерево поиска. Программа получает на вход последовательность чисел и строит из них бинарное дерево поиска. Элементы в деревья добавляются в соответствии с результатом поиска их места. Если элемент уже существует в дереве, добавлять его не надо. Балансировка дерева не производится.
Программа получает на вход последовательность натуральных чисел (типа int).
Последовательность завершается число 0, которое означает конец ввода, и добавлять его в дерево не надо.
Вот пример построенного дерева для последовательности 7 3 2 1 9 5 4 6 8 0:
После построения дерева решите поставленную задачу.
Выведите высоту полученного дерева (реализуйте рекурсивную процедуру, возвращающую высоту дерева).
| Ввод | Вывод |
|---|---|
7 |
4 |
Подсчитайте количество элементов в получившемся дереве (реализуйте рекурсивную процедуру, возвращающую количество элементов в дереве).
| Ввод | Вывод |
|---|---|
1 |
3 |
Выведите второй по величине элемент в построенном дереве. Гарантируется, что такой найдется.
| Ввод | Вывод |
|---|---|
7 |
8 |
1 |
1 |
Выведите все элементы полученного дерева в порядке возрастания. Удобней это делать при помощи рекурсивной процедуры.
| Ввод | Вывод |
|---|---|
7 |
1 2 3 4 5 6 7 8 9 |
Для полученного дерева выведите список всех листьев (вершин, не имеющих потомков) в порядке возрастания.
| Ввод | Вывод |
|---|---|
7 |
1 4 6 8 |
Для полученного дерева выведите список всех вершин, имеющих по два ребёнка, в порядке возрастания.
| Ввод | Вывод |
|---|---|
7 |
3 5 7 |
Для полученного дерева выведите список всех вершин, имеющих только одного ребёнка, в порядке возрастания.
| Ввод | Вывод |
|---|---|
7 |
2 9 |
Дерево называется сбалансированным, если для любой его вершины высота левого и правого поддерева для этой вершины различаются не более чем на 1. Определите, является ли дерево сбалансированным, выведите слово YES или NO.
| Ввод | Вывод |
|---|---|
7 |
YES |
1 |
NO |
По данной последовательности постройте дерево, запоминая для каждого элемента его значение и количество его повторений в последовательности.
Выведите на экран содержимое дерева в порядке возрастания, по одному элементу на строку. В каждой строке выводите значение элемента, затем, через пробел, укажите, сколько раз он встречается в исходной последовательности.
| Ввод | Вывод |
|---|---|
9 |
1 1 |
Реализуйте процедуру удаления элементов из бинарного дерева поиска. Правила удаления следующие:
Программа получает на вход последовательность целых чисел, заверщающаяся числом 0. При этом положительное число \(+d\) обозначает, что в дерево нужно добавить элемент со значением \(d\) (возможно, что он уже есть в дереве).
Отрицательное число \(-d\) означает, что из дерева нужно удалить элемент со значением \(d\), вполне возможно, что в дереве такого элемента нет (тогда дерево не модифицируется).
После окончания ввода программа должна вывести все элементы в дереве в порядке возрастания. В одной строке выводится три числа: значение элемента, значение его левого потомка, значение его правого потомка. Если у элемента нет соответствующего потомка, то выводится число 0.
| Ввод | Вывод |
|---|---|
7 |
1 0 0 |