- •Задание № 2 Абстрактный тип данных
- •1) Список строк (string list)
- •2) Стек строк (string stack)
- •3) Множество строк (string set)
- •4) Вещественная матрица (matrix)
- •5) Кусочно-постоянная функция (step function)
- •6) Многочлен (polynomial)
- •7) Граф (graph)
- •8) Дата и время (datetime)
- •Задание № 3 Реализация абстрактных классов
1) Список строк (string list)
строка понимается в стиле Си: char *, на конце \0.
Выбрать: 1. Длина строки ограничена константой или объемом оперативной памяти (выбрать что-то одно)
2. Однонаправленный или двунаправленный
Обязательные возможности:
list( char* ) // конструктор списка из одного элемента
list + list // вернуть конкатенацию списков, операнды неизменны
list += list // присоединить к первому списку, второй неизменен
char* + list // добавить элемент в начало списка
list + char* // добавить элемент в конец списка
list - char* // удалить элемент, если есть
list[i] // получить копию i-го элемента
приведение к char* () // выписать все элементы через \n
Дополнительные возможности:
// реализовать независимость всех операций от пробелов в начале или в конце строк, т.е.
// можно добавить "abc ", затем успешно удалить " abc ".
list * list // для списков одной длины, построить список пар через \n, по одной строке из каждого списка
list[i] = char* // вставить элемент на i-е место, со сдвигом остальных вперед
2) Стек строк (string stack)
строка понимается в стиле Си: char *, на конце \0. Стек в обычном понимании (первый вошел -- последний вышел), в котором хранятся строки с владением, т.е. при уничтожении вся выделенная под них память освобождается. Для сравнения: хранение без владения означает, что хранятся и удаляются лишь указатели, а память управляется кем-то еще, тогда наш контейнер используется только для организации указателей.
Выбрать: 1. Длина строки ограничена константой или объемом оперативной памяти.
2. Емкость стека ограничена константой или параметром конструктора или
объемом оперативной памяти.
Обязательные операции:
stack::push( char* ) // положить копию строки
char* stack::pop() // вернуть верхний элемент с удалением из стека
char* stack::peek() // вернуть копию верхнего элемента без удаления
int stack::length() // текущий размер
int stack::maxsize() // максимальный размер (или -1, если "неограничен")
stack + char* // синоним push
stack - char*& // синоним pop, записывающий результат во второй операнд
3) Множество строк (string set)
строка понимается в стиле Си: char *, на конце \0. Выбрать: 1. Длина строки ограничена константой или объемом оперативной памяти.
Нужно реализовать эффективный тип данных: множество строк. Чаще всего в этом множестве будет осуществляться поиск, поэтому реализовать его нужно бинарным деревом поиска. Пользователя нужно избавить от деталей реализации, предоставив простой внешний интерфейс.
Обязательные операции:
set::add( char* ) // вставка с балансировкой
set::member( char* ) // проверка вхождения
set::delete( char* ) // удалить, если есть
int set::size() // число элементов
set + char* // синоним add
set ^ char* // синоним member
set - char* // синоним delete
Дополнительные операции:
// реализовать незаисимость всех операций от пробелов в начале или в конце строк, т.е.
// можно добавить "abc ", затем успешно удалить " abc ".
set::optimize() // перебалансировка дерева. Если это реализовано,
// то вставка всегда осуществляется быстрейшим способом,
// без балансировки.
// Периодически, когда время позволяет (например, нет
// запросов к системе), пользователь класса вызывает optimize
// для того, чтобы "утрясти" дерево и ускорить поиск.
