Абстра́ктный тип да́нных (АТД) — это тип данных, который предоставляет для работы с элементами этого типа определённый набор функций, а также возможность создавать элементы этого типа при помощи специальных функций. Вся внутренняя структура такого типа спрятана от разработчика программного обеспечения — в этом и заключается суть абстракции. Абстрактный тип данных определяет набор функций, независимых от конкретной реализации типа, для оперирования его значениями. Конкретные реализации АТД называются структурами данных. Примеры АТД: Список; Стек; Очередь; Ассоциативный массив; Очередь с приоритетом.
Динамические структуры (или списки) - способ хранения информации, похожий на обычные структуры с тем лишь отличием, что в нашем случае кроме содержания информационные поля, существуют указатели на свой собственный тип структуры, а память выделяется динамически. Это приводит к экономии памяти и большей гибкости программы в отличие от массивов. Объявление и заполнение структуры:
NodePtr p; //указатель на текущий элемент
NodePtr tail; //указатель на "хвост" очереди
if (head == NULL)
{ head = new node;
head->info = 1; // или какому-то другому значению
head->next = NULL; }
for (int i=1;i<=N;i++) //где N -количество элементов
{ p = new node;
p->info = 2;
p->next = head->next; // в данном случае - NULL
head->next = p;
tail = p; }
Стеки - это множество элементов, сложенных в стопку. В стеках реализуется принцип first in last out (FILO) Для создания стека нужно подключить <stack> и в коде программы его объявить: stack <type> name, где type - тип стека, а name - имя стека. У стека есть немного функций: push() - добавить элемент; pop() - удалить верхний элемент; top() - получить верхний элемент; size() - размер стека; empty() - true, если стек пуст. Пример:
string s;
stack <string> st;
while (cin>>s);
st.push(s);
while (!(st.empty()))
{cout<<st.top();st.pop()}
Очереди, как следует из название, используют принцип first in first out (FIFO). Реализуются очереди также просто. Подключаем <queue>. И создаем очередь queue <type> name;
Перечень функций почти тот-же: push() - добавить элемент; pop() - удалить первый элемент; size() - размер очереди; empty() - true, если очередь пуста; front() - получить первый элемент; back() - получить последний элемент. Пример:
queue <int> events;
int n;
while (cin>>n)
events.push(n);
while (!events.empty)
{make(events.front());events.pop()}
В данном примере make - какая-то функция, обрабатывающая события