Процедури обробки черг і стеків Д И Н А М І Ч Н І С Т Р У К Т У Р И Д А Н И Х Структуровані типи даних, такі, як масиви, множини, записи, являють собою статичні структури, тому що їхні розміри незмінні протягом усього часу виконання програми. Часто потрібно, щоб структури даних змінювали свої розміри в ході рішення задачі. Такі структури даних називаються динамічними, до них відносяться стеки, черги, списки, дерева й інші. Опис динамічних структур за допомогою масивів, записів і файлів приводить до нераціонального використання пам'яті ЕОМ і збільшує час рішення задач. Кожний компонент будь-якої динамічної структури являє собою запис, що містить принаймні два полю чи: одне поле типу вказівник, а друге - для розміщення даних. У загальному випадку запис може містити не один, а декілька вказівників і кілька полів даних. Поле даних може бути змінною, масивом, множиною або записом. Опис цього компонента дамо в такий спосіб: type Pointer = ^Comp; Comp = record D:T; pnext:pointer тут T - тип даних. Розглянемо основні правила роботи з динамічними структурами даних типу стек, черга. С Т Е К И Стеком називається динамічна структура даних, додавання компонента в яку і виключення компонента з якої відбувається з одного кінця, який називається вершиною стека. Стік працює за принципом LIFO (Last-In, First-Out) останнім прийшов, першим пішов. Звичайно над стеками виконується три операції: -початкове формування стеку (запис першого компонента); -додавання компонента в стек; -вибірка компонента (вилучення). Для формування стека і роботи з ним необхідно мати два перемінні типу вказівник, перша з яких визначає вершину стека, а друга - допоміжна. Нехай опис цих перемінних має вигляд: var ptop, paux: Pointer; 1 / 6
де ptop - покажчик вершини стека; paux - допоміжний покажчик. Початкове формування стека виконується наступними операторами: New(pTop); ptop^.pnext:=nil; Останній оператор або група операторів записує вміст поля чи даних першого компонента. Додавання компонента в стек відбувається з використанням допоміжного вказівника: Додавання наступних компонентів виробляється аналогічно. NEW(pAux); paux^.pnext:=ptop; ptop:=paux; Розглянемо процес вибірки компонент зі стека. sc:=ptop^.sd; ptop:=ptop^.pnext Приклад. Скласти програму, що формує стек, додає в нього довільну кількість компонентів, а потім читає усі компоненти і виводить їх на екран, як дані взяти рядок символів. Введення даних - з клавіатури, ознака кінця введення рядок символів END. Program STACK; uses Wincrt; type Alfa= String[10]; PComp= ^Comp; Comp= Record sd: Alfa; pnext: PComp var ptop: PComp; sc: Alfa; Procedure CreateStack(var ptop: PComp; var sc: Alfa); New(pTop); ptop^.pnext:=nil; 2 / 6
Procedure AddComp(var ptop: PComp; var sc: Alfa); var paux: PComp; NEW(pAux); paux^.pnext:=ptop; ptop:=paux; Procedure DelComp(var ptop: PComp; var sc:alfa); sc:=ptop^.sd; ptop:=ptop^.pnext Clrscr; writeln(' ВВЕДІТЬ РЯДОК '); CreateStack(pTop,sC); writeln(' ВВЕДІТЬ РЯДОК '); AddComp(pTop,sC) until sc='end'; writeln('****** РЕЗУЛЬТАТИ ВИКОНАННЯ ******'); DelComp(pTop,sC); writeln(sc); until ptop = NIL end. Ч Е Р Г И Чергою називається динамічна структура даних, додавання компонента в яку здійснюється в кінець, а вибірка здійснюється з іншого кінця. Черга працює за принципом: FIFO (First-In, First-Out) першим прийшов першим пішов. Для формування черги і роботи з нею необхідно мати три змінні типу вказівник, перша з яких вказує на початок черги, друга на кінець черги, третя - допоміжна. Опис компоненти черги і змінних типу вкзівник дамо в такий спосіб: type PComp=^Comp; Comp=record D:T; pnext:pcomp 3 / 6
var pbegin, pend, paux: PComp; де pbegin - вказівник початку черги, pend - вказівник кінця черги, paux - допоміжний вказівник. Тип Т визначає тип даних компоненту черги. Початкове формування черги виконується наступними операторами: New(pBegin); pbegin^.pnext:=nil; pbegin^.sd:=sc; pend:=pbegin Додавання компонента в чергу відбувається в кінець черги: New(pAux); paux^.pnext:=nil; pend^.pnext:=paux; pend:=paux; pend^.s:=s Додавання наступних компонентів відбувається аналогічно. New(pAux); paux^.pnext:=nil; pend^.pnext:=paux; pend:=paux; pend^.sd:=sc Вибірка компонента з черги здійснюється з початку черги, одночасно компонента виключається з черги. Вибірка компонента виконується наступними операторами: sc:=pbegin^.sd; pbegin:=pbegin^.pnext 4 / 6
Приклад. Скласти програму, що формує чергу, додає в неї довільна кількість компонентів, а потім читає усі компоненти і виводить їх на екран дисплея. Як дані взяти рядок символів. Уведення даних - із клавіатури дисплея, ознака кінця введення - рядок символів END. Program QUEUE; uses Wincrt; type Alfa= String[10]; PComp= ^Comp; Comp= record sd:alfa; pnext:pcomp var pbegin, pend: PComp; sc: Alfa; Procedure CreateQueue(var pbegin,pend: PComp; var sc: Alfa); New(pBegin); pbegin^.pnext:=nil; pbegin^.sd:=sc; pend:=pbegin Procedure AddQueue(var pend:pcomp; var sc:alfa); var paux: PComp; New(pAux); paux^.pnext:=nil; pend^.pnext:=paux; pend:=paux; pend^.sd:=sc Procedure DelQueue(var pbegin: PComp; var sc: Alfa); sc:=pbegin^.sd; pbegin:=pbegin^.pnext 5 / 6
BEGIN Clrscr; writeln(' УВЕДИ РЯДОК '); CreateQueue(pBegin,pEnd,sC); writeln(' УВЕДИ РЯДОК '); AddQueue(pEnd,sC) until sc='end'; writeln(' ***** ВИСНОВОК РЕЗУЛЬТАТІВ *****'); DelQueue(pBegin,sC); writeln(sc); until pbegin=nil end. 6 / 6