Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_13-17_САОД_Bullleto_DC_CT_LE_LcMS.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
867.33 Кб
Скачать

Определение абстрактного типа данных. Атд списки, очереди, стек.

Абстрактный тип данных (АТД) – математическая модель данных в совокупности с операциями, определенными на этих данных.

Связанный список – это структура данных, в которой объекты расположены в линейном порядке. В отличие от массива порядок в связанном списке определяется указателями на каждый объект. Связанные списки обеспечивают простое и гибкое представление динамических множеств и поддерживают все операции.

Списки особенно полезны в тех случаях, когда данные в памяти необходимо запоминать сразу же, а мы заранее не знаем, сколько данных можем получить, или когда требуется переставлять данные произвольным образом.

Структура данных содержит указатель на экземпляр самой себя. Используя этот указатель, чтобы указывать на следующий элемент в списке, можно быстро и просто создавать списки, а также добавлять новые элементы в любое место списка, в том числе и в начало.

О дносвязный список – это способ соединения объектов, таким образом, когда каждый объект указывает на следующий объект в этом списке. Требуется «сигнальное» значение для обозначения конца списка (в С/C++ используется NULL). В односвязном списке можно передвигаться только в сторону конца списка. Узнать адрес предыдущего элемента невозможно.

Insert (X,p,l) – X - объект который вставляем в список l в позицию p.

Locate (x,l) – возвращает позицию объекта x в списке.

Retrieve (p,l) – возвращает элемент в позиции p. Delete (p,l) – удалить элемент в позиции p из списка l.

Next (p,l) – следующий за p. First (l) – возвращает первую позицию.

В односвязном списке невозможно вернуться к началу. При добавлении указателей на предыдущий элемент односвязный список становится двусвязным.

По двусвязному списку можно передвигаться в любом направлении - как к началу, так и к концу. В этом списке проще производить удаление и перестановку элементов, так как всегда известны адреса тех элементов списка, указатели которых направлены на изменяемый элемент.

Д обавление указателя на предыдущий элемент увеличивает накладные расходы, связанные со структурой списка, но они почти всегда окупаются.

Insert (X,p,l) – X - объект который вставляем в список l в позицию p.

Locate (x,l) – возвращает позицию объекта x , в списке.

First (l) – возвращает первую позицию. End (l) – возвращает позицию за последним элементом.

Retrieve (p,l) – возвращает элемент в позиции p. Delete (p,l) – удалить элемент в позиции p из списка l.

Next (p,l) – следующий за позицией p, Previous(p,l) –предыдущий перед p.

Циклические списки – односвязный или двусвязный список, последний элемент которого содержит указатель на первый, а первый (в случае двусвязного списка) - на последний.

В нём отсутствуют первый и последний элементы. Поэтому полезно ввести понятие текущей позиции, через которую выполняются все операции. Если нужный элемент находится не на текущей позиции, то мы можем как бы поворачивать список до тех пор, пока не получим элемент, который требуется.

insert_right(x,l) – вставить элемент x после текущего положения (x становится текущим элементом)

insert_left(x,l) – вставить элемент x до текущего положения (текущий элемент не меняется)

delete(l) – удаляет узел до текущего положения

n ext(l) – сделать следующий элемент текущим (прокрутить список вперед)

previous(l) – сделать предыдущий элемент текущим (прокрутить список назад)

Очередь - структура данных с дисциплиной доступа к элементам «первый пришёл - первый вышел» (FIFO, First In — First Out). Добавление элемента возможно лишь в конец очереди, выборка - только из начала очереди, при этом выбранный элемент из очереди удаляется. Пример из реальной жизни — очередь людей в кассу.

void put(Item); - добавление Item get(); - удаление

Очередь по приоритету – это структура данных, которая обеспечивает хранение элементов данных в порядке приоритета. Функционирует по правилу: первым пришёл, наибольшим ушёл или первым пришёл, наименьшим ушёл.

handle insert(Item); - вставка элемента(возвращает дескриптор);

Item getmax(); - взять элемент с максимальным(минимальным) ключом;

void change(handle, Item) - изменить приоритет элемента;

void remove(handle) - удалить элемент

Двусторонняя очередь (дек) – первым или последним пришёл, первым или последним ушёл. Можно добавлять и удалять элементы с любой стороны дека, но нельзя добавлять или удалять элементы в любом другом месте дека. Можно представить как последовательность книг стоящих на полке, так что доступ к ним возможен с обоих концов.

void push_front(Item) — добавить в начало дека новый элемент

void push_back(Item) — добавить в конец дека новый элемент

Item pop_front() - извлечь из начала дека элемент

Item pop_back() - извлечь из конца дека элемент

int size() - узнать количество элементов в деке

Стек (стопка) - структура данных с методом доступа к элементам LIFO (Last In — First Out, последним пришел — первым вышел). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно взять верхнюю.

Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху), выталкивание (pop) — также только из вершины стека, при этом второй сверху элемент становится верхним.

void push(Item item); - добавить в стек элемент

Item pop(); - изъять из стека элемент

int size() - узнать размер стека

Удобен для вычисления арифметических выражений, например, (9+8)*(4-6) — нужно сначала вычислить сумму и запомнить значение, потом вычислить разность, взять из стека результат суммы и умножить на результат разности.