Стеком (англ. 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 |