cpp 04.pptx
- Количество слайдов: 53
ПОЛУСТАТИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ
ПРИЗНАКИ • имеют переменную длину и простые процедуры ее изменения; • изменение длины структуры происходит в определенных пределах, не превышая какого-то максимального (предельного) значения.
ЛОГИЧЕСКИЙ УРОВЕНЬ Последовательность данных, связанная отношениями линейного списка. Доступ к элементу может осуществляться по его порядковому номеру ФИЗИЧЕСКОЕ ПРЕДСТАВЛЕНИЕ Последовательность слотов в памяти, где каждый следующий элемент расположен в памяти в следующем слоте (т. е. вектор)
СТЕКИ
Стек - последовательный список с переменной длиной, включение и исключение элементов из которого выполняются только с одной стороны списка, называемого вершиной стека. Другие названия стека - магазин и очередь LIFO (Last - In - First- Out ) Примеры: винтовочный патронный магазин, тупиковый железнодорожный разъезд для сортировки вагонов.
ОПЕРАЦИИ НАД СТЕКОМ Основные операции над стеком: • Начальное формирование стека • включение нового элемента (push) • исключение элемента из стека (pop). Вспомогательные операции: • определение текущего числа элементов в стеке; • очистка стека; • неразрушающее чтение элемента из вершины стека, которое может быть реализовано, как комбинация основных операций: x: =pop(stack); push(stack, x).
СХЕМА СТЕКА
Пустой стек; Последовательное включение в него элементов с именами 'A', 'B', 'C'; Последовательное удаление из стека элементов 'C' и 'B'; Включение в стек элемента 'D'.
СХЕМАТИЧНОЕ ИЗОБРАЖЕНИЕ СТЕКА
struct stk { int elem; node *sled; };
СТЕК ПУСТ stk = NULL;
ФОРМИРОВАНИЕ НОВОГО ЭЛЕМЕНТА cin>>Элем; t = new (node); (*t). elem = Элем; (*t). sled = stk;
"НАСТРОЙКА" УКАЗАТЕЛЯ СТЕКА stk = t;
Первый элемент в стеке
РАЗМЕЩЕНИЕ В СТЕКЕ ВТОРОГО ЭЛЕМЕНТА cin>>Элем 1; t = new (node); (*t). elem = Элем 1; (*t). sled = stk;
"Настройка" указателя стека stk = t;
В стеке два элемента
ПОСТРОЕНИЕ СТЕКА void POSTROENIE (node **stk) { node *t; int el; *stk = NULL; cin>>el; while (el!=0) { t = new (node); (*t). elem = el; (*t). sled = *stk; *stk = t; cin>>el; }}
ВКЛЮЧЕНИЕ ЗВЕНА В СТЕК Исходное состояние стека
Создание нового элемента q = new (node); (*q). elem = Элем;
Включение элемента в стек (*q). sled = stk;
"Настройка" указателя вершины стека stk = q;
ДОБАВЛЕНИЕ void W_S (node **stk, int el) { node *q; q = new (node); (*q). elem = el; (*q). sled = *stk; *stk = q; }
ПОСТРОЕНИЕ НОВАЯ void POSTROENIE (node **stk) { int el; *stk = NULL; cin>>el; while (el!=0) { W_S (stk, el); cin>>el; }}
УДАЛЕНИЕ ЗВЕНА ИЗ СТЕКА Исходный стек
Сохранение удаляемого элемента klad = (*stk). elem;
"Перенастройка" указателя стека q = stk; stk = (*stk). sled;
Очистка памяти delete q;
УДАЛЕНИЕ ЭЛЕМЕНТА ИЗ СТЕКА void YDALENIE (node **stk, int klad) { node *q; if (*stk==NULL) cout<<"Стек пуст!n"; else { *klad = (**stk). elem; q = *stk; *stk = (**stk). sled; delete q; }}
ОЧЕРЕДИ FIFO
ЛОГИЧЕСКАЯ СТРУКТУРА ОЧЕРЕДИ Очередью FIFO (First - In - First- Out) называется последовательный список с переменной длиной, в котором включение элементов выполняется только с одной стороны списка (эту сторону часто называют концом или хвостом очереди), а исключение - с другой стороны (называемой началом или головой очереди)
ОПЕРАЦИИ НАД ОЧЕРЕДЬЮ Основные операции над стеком: • Начальное формирование стека • включение нового элемента (push) • исключение элемента из стека (pop). Вспомогательные операции: • определение текущего числа элементов в стеке; • очистка стека; • неразрушающее чтение элемента из вершины стека, которое может быть реализовано, как комбинация основных операций: x: =pop(stack); push(stack, x).
СХЕМАТИЧНОЕ ИЗОБРАЖЕНИЕ ОЧЕРЕДИ
ФОРМИРОВАНИЕ ОЧЕРЕДИ Первый элемент в очереди r = new (node); (*r). elem = Элем; (*r). sled = NULL;
Настройка указателей начала и конца очереди no = r; ko = r;
Создание нового элемента очереди r = new (node); (*r). elem = Элем 1; (*r). sled = NULL;
Настройка указателя на конец очереди (*ko). sled = r; ko = r;
void POSTROENIE (node **no, node **ko) { node *r; int el; cin>>el; if (el!=0) { r = new (node); (*r). elem = el; (*r). sled = NULL; *no = r; *ko = r; cin>> el; while (el!=0) { r = new (node); (*r). elem = el; (*r). sled = NULL; (**ko). sled = r; *ko = r; cin>>el; } } else { r = NULL; *no = r; *ko = r; }}
ДОБАВЛЕНИЕ ЗВЕНА К ОЧЕРЕДИ Заполнение добавляемого звена r = new (node); (*r). elem = Элем; (*r). sled = NULL;
Присоединение звена к очереди (*ko). sled = r;
"Настройка" указателя на конец очереди ko = r;
void DOBAVLENIE (node **no, node **ko, int el) { node *r; r = new (node); (*r). elem = el; (*r). sled = NULL; if (*no!=NULL) { (**ko). sled = r; *ko = r; } else { *no = r; *ko = r; }}
УДАЛЕНИЕ ЗВЕНА ИЗ ОЧЕРЕДИ
Сохранение удаляемого элемента klad = (*no). elem;
Удаление delete q;
void YDALENIE (node **no, node **ko, int klad) { node *q; if (*no==NULL) cout<< "Удалить нельзя, так как очередь пуста!n"; else { *klad = (**no). elem; q = *no; *no = (**no). sled; delete q; } }
ОЧЕРЕДИ С ПРИОРИТЕТАМИ Порядок выборки элементов из таких очередей определяется приоритетами элементов. Приоритет в общем случае может быть представлен числовым значением, которое FIFO, и LIFO-очереди могут трактоваться как приоритетные очереди, в которых приоритет элемента зависит от времени его включения в очередь. При выборке элемента всякий раз выбирается элемент с наибольшим приоритетом. Возможны очереди с приоритетным включением - в которых последовательность элементов очереди все время поддерживается упорядоченной, т. е. каждый новый элемент включается на то место в последовательности, которое определяется его приоритетом, а при исключении всегда выбирается элемент из начала. Возможны и очереди с приоритетным исключением - новый элемент включается всегда в конец очереди, а при исключении в очереди ищется (этот поиск может быть только линейным) элемент с максимальным приоритетом и после выборки удаляется из последовательности.
ДЕКИ
Дек - особый вид очереди. Дек (deq - double ended queue) - это такой последовательный список, в котором как включение, так и исключение элементов может осуществляться с любого из двух концов списка. Частный случай дека - дек с ограниченным входом и дек с ограниченным выходом. Логическая и физическая структуры дека аналогичны логической и физической структуре кольцевой FIFO-очереди.
ОПЕРАЦИИ НАД ДЕКОМ • Формирование дека • включение элемента справа; • включение элемента слева; • исключение элемента справа; • исключение элемента слева; • определение размера; • очистка.