- •Оглавление
- •Введение
- •Лабораторная работа №1. Реализация алгоритмов сортировки и поиска Задачи работы
- •Задание на лабораторную работу
- •Сортировка Шелла
- •Сортировка шейкером
- •Сортировка расческой (Comb sort)
- •Плавная сортировка (Smooth sort)
- •Метод Patience sorting
- •Лабораторная работа №2. Понятие контейнера данных. Основные типы контейнеров Задачи работы
- •Задание на лабораторную работу
- •Требования к отчетности по лабораторной работе
- •Предлагаемые этапы выполнения работы
- •Теоретический материал, необходимый для выполнения лабораторной работы Основные типы контейнеров Списки
- •Бинарные деревья поиска
- •Добавление элемента
- •Удаление элемента
- •Понятие сбалансированности дерева
- •Словари
- •Очереди с приоритетами
- •Очереди
- •Лабораторная работа №3. Использование стандартных контейнеров данных Задачи работы
- •Задание на лабораторную работу
- •Лабораторная работа №4. Использование стандартных реализаций алгоритмов stl Задачи работы
- •Задание на лабораторную работу
- •Кафедра компьютерной фотоники
Очереди
Очередь – это контейнер, работающий по принципу First In – First Out. В нем возможно удаление только того элемента, который был добавлен раньше всех.
Очередь поддерживает четыре операции – добавить элемент, посмотреть на последний добавленный элемент, посмотреть на добавленный раньше всех элемент, удалить добавленный раньше всех элемент.
Реализация очереди требует наличия у контейнера операций добавления элемента в конец, удаления элемента из начала и доступа к первому и последнему элементу. Очередь может быть эффективно построена на базе двунаправленного списка, двусторонней очереди.
При реализации очереди на базе массива возникает следующая проблема. Если первый в очереди элемент хранить как первый элемент массива, время извлечения первого элемента будет равно O(N) за счет необходимости сдвига оставшихся элементов. Это неприемлемо, поэтому нужно будет не сдвигать элементы, а изменять специальный индекс, запоминающий положение начала очереди в массиве.
При этом память от начала массива до начала очереди не должна пустовать. Если для нового элемента нет места в конце массива, но есть свободные места в начале – его нужно разместить в начале (мысленно замкнуть массив в кольцо). Если позже возникнет необходимость в росте массива (из-за увеличения числа элементов очереди), важно корректно перенести элементы в расширенный массив.
Описание работы с указателями в языке программирования C++
См. лабораторную работу №1.
Описание работы с классами в языке программирования C++
Класс в C++ - это определяемый пользователем тип данных. Переменную, типом которой является класс, называют объектом (экземпляром) класса.
Пользователь может задать поля данных класса и методы класса (member functions). Поля данных (у каждого из которых есть тип) – это значения, которые объект класса должен помнить внутри себя. Методы – это операции, которые могут быть выполнены с объектом класса. Таким образом, как и для любого типа данных [1], для класса определяется его способ хранения в памяти и набор операций. При этом программист может самостоятельно определить и то, и другое.
Например, может существовать класс комплексного числа, выглядящий примерно так:
class TComplex
{
public: //Эти операции могут быть вызваны снаружи, из-за пределов класса
TComplex( double a , double b );
//Это конструктор – специальный метод, создающий из параметров
//переменную данного класса.
TComplex operator+( TComplex_ other );
//Это оператор (специальный вид метода) сложения.
//Он прибавляет к данному комплексному числу комплексное число other
//и возвращает комплексное число как результат.
void Read();
//Это объявлен метод. Он не требует параметров и
//возвращает пустой результат.
private: //То, что ниже – доступно только самому классу.
//Поля данных – TComplex хранит внутри два вещественных числа.
double Real; //действительная часть
double Imag; //мнимая часть
};
//Реализуем конструктор, т.е. определяем, как из двух чисел создается //TComplex
TComplex::TComplex( double a , double b )
{
//Вот так – первое число записывается в поле Real, второе – в поле Imag.
Real = a;
Imag = b;
}
//Реализуем сложение. Как данное число прибавляет к себе другое число //(other)?
TComplex TComplex::operator+( TComplex_ other )
{
//Создаем переменную типа Complex. Записываем в ее поле Real сумму
//своего поля Real и поля Real переданного параметра, Imag –аналогично.
TComplex res( 0 , 0 );
res.Real = Real + other.Real;
res.Imag = Imag + other.Imag;
//Вернем эту переменную в качестве результата операции
return res;
}
//Что делает комплексное число, если его
//попросят сделать операцию Read?
void TComplex::Read()
{
//Вот что делает – читает с экрана два вещественных числа, записывая их
//в поля Real и Imag.
scanf ( “%f %f” , &Real , &Imag );
}
void main()
{
TComplex a( 2 , 3 );
//Создали переменную типа TComplex. Конструируем ее из двух чисел -
//у нас есть такой конструктор, поэтому мы можем это сделать.
TComplex b( 0 , 0 );
b.Read();
//Применим к переменной b операцию Read (как мы знаем, она в этом
//случае считает с экрана два вещественных числа – действительную
//и мнимую часть.)
TComplex c = a + b;
//Этот код вызовет у комплексного числа a оператор сложения, передав
//ему в качестве параметра число b. Результат будет записан в c.
}