Полустатические структуры данных.pptx
- Количество слайдов: 46
Полустатические структуры данных
они имеют переменную длину и простые процедуры ее изменения; изменение длины структуры происходит в определенных пределах, не превышая какого-то максимального (предельного) значения
Стеки Последовательный список с переменной длиной, включение и исключение элементов из которого выполняются только с одной стороны списка, называемого вершиной стека. Применяются и другие названия стека - магазин и очередь, функционирующая по принципу LIFO (Last - In - First- Out - "последним пришел - первым исключается").
Основные операции над стеком включение нового элемента (английское название push - заталкивать) исключение элемента из стека (англ. pop – выскакивать)
вспомогательные операции определение текущего числа элементов в стеке; очистка стека; неразрушающее чтение элемента из вершины стека, которое может быть реализовано, как комбинация основных операций
Type Ptr. Rec = ^Rec; Rec = Record Element : Type. Element; {информационное поле компоненты стека} p. Next : Ptr. Rec; {ссылка на следующую компоненту стека} End; Var p. Top, p. Aux : Ptr. Rec;
формирование стека и добавление нового элемента New(p. Top); p. Top^. p. Next: =Nil; p. Top^. Element : = D 1;
Procedure Create_Stack(var p. Top: Ptr. Rec; D: Type. Element); Begin New(p. Top); p. Top^. p. Next : = Nil; p. Top^. Element : =D; End;
добавление нового элемента в стек В динамической области памяти резервируем место для динамического объекта p. Aux: Read. Ln(D 2); New(p. Aux);
Определим ссылку нового звена на вершину стека: p. Aux^. p. Next : = p. Top;
Переместим указатель на вершину стека p. Top на новое сформированное звено p. Aux: p. Top : = p. Aux;
В информационное поле новой вершины поместим значение D 2: p. Top^. Element : = D 2;
процедура добавления элемента с информационным полем D в стек: Procedure Add_Stack(var p. Top: Ptr. Rec; D: Type. Element); Var p. Aux : Ptr. Rec; Begin New(p. Aux); p. Aux^. p. Next : = p. Top; p. Top : = p. Aux; p. Top^. Element : = D; End;
процедура добавления в стек новой компоненты Procedure Add_Stack_2(var p. Top: Ptr. Rec; El: Type. Element); Var p. Aux : Ptr. Rec; Begin New (p. Aux); p. Aux^. Element : = El; {заполняем информационное поле нового элемента} p. Aux^. p. Next : = p. Top; {создаем ссылку на предыдущий элемент} p. Top : = p. Aux; {переопределяем вершину стека} End;
процедура построения стека на основе процедуры добавления в стек новой компоненты Procedure Create_Stack_2(var p. Top: Ptr. Rec); Var p. Aux : Ptr. Rec; elem : Type. Element; Begin New(p. Top); p. Top : = Nil; Read. Ln (elem); While elem <> 0 do Begin Add_Stack_2(p. Top, elem); Read. Ln (elem); End;
удаление вершины стека
Чтение данных из вершины стека D : = p. Top^. Element;
Вспомогательная переменная p. Aux позволит избавиться от "мусора" p. Aux : = p. Top;
изменяет значение указателя на вершину стека p. Top : = p. Aux^. p. Next;
удалить ненужную ссылку p. Aux^. p. Next : = Nil;
освобождение динамической области памяти Dispose (p. Aux); p. Aux : = Nil;
процедура удаления из стека элемента с информационным полем D: Procedure Del_Stack(var p. Top: Ptr. Rec; var D: Type. Element); Var p. Aux : Ptr. Rec; Begin If p. Top = Nil Then Write. Ln ('Попытка выбора из пустого стека!') Else Begin D : = p. Top^. Element; p. Aux : = p. Top; p. Top : = p. Top^. p. Next; Dispose(p. Aux); p. Aux : = Nil; End;
Просмотр информационного поля вершины стека Procedure Viewing_Top (p. Top: Ptr. Rec; var D: Type. Element); Begin D : = p. Top^. Element; End;
Определение наличия элементов в стеке Function Empty_Stack (p. Top: Ptr. Rec) : Boolean; Begin Empty_Stack : = p. Top = Nil; End;
Получение копии стека Procedure Copy_Stack(p. Top 1: Ptr. Rec; var p. Top 2: Ptr. Rec); Var p. Aux, p. Top 3 : Ptr. Rec; Begin p. Top 3 : = Nil; If p. Top 1 <> Nil Then Begin p. Aux : = p. Top 1; While p. Aux <> Nil do Begin Add_Stack(p. Top 3, p. Aux^. Element); p. Aux : = p. Aux^. p. Next; End; p. Top 2 : = Nil; p. Aux : = p. Top 3; While p. Aux <> Nil do Begin Add_Stack(p. Top 2, p. Aux^. Element); p. Aux : = p. Aux^. p. Next; End; Else p. Top 2 : = Nil; End;
Очереди FIFO Очередью FIFO (First - In - First- Out - "первым пришел - первым исключается"). называется такой последовательный список с переменной длиной, в котором включение элементов выполняется только с одной стороны списка (эту сторону часто называют концом или хвостом очереди), а исключение - с другой стороны (называемой началом или головой очереди). Те самые очереди к прилавкам и к кассам, которые мы так не любим, являются типичным бытовым примером очереди FIFO
Основные операции над очередью начальное формирование очереди (запись первой компоненты); добавление компоненты в конец очереди; определение первого элемента в очереди с последующим извлечением его из очереди.
Описание компоненты очереди Type Ptr. Rec = ^Rec; Rec = Record Element : Type. Element; {информационное поле компоненты очереди} p. Next : Ptr. Rec; {ссылка на следующую компоненту очереди} End;
Для формирования очереди и работы с ней необходимо описать три переменные типа указатель: переменная p. Beginопределяет начало очереди, p. End - конец очереди, p. Aux - вспомогательная: Var p. Begin, p. End, p. Aux: Ptr. Rec;
Начальное формирование очереди Read. Ln(T 1); New(p. Begin); p. Begin^. Element : = T 1; {определим информационное поле первой компоненты очереди} p. Begin^. p. Next : = Nil; p. End : = p. Begin; {определим ссылку на последнюю компоненту очереди}
процедура формирования очеред Procedure Create_Queue(var p. Begin, p. End : Ptr. Rec; T: Type. Element); Begin New(p. Begin); p. Begin^. p. Next : = Nil; p. Begin^. Element : = T; p. End : = p. Begin; End;
добавление компоненты в конец очереди New(p. Aux);
Ссылка нового звена на следующий элемент очереди не определена p. Aux^. p. Next : = Nil;
Последний элемент очереди должен ссылаться на новое звено p. End^. p. Next : = p. Aux;
Указатель на последний элемент очереди передвигаем p. End : = p. Aux;
p. End^. Element : = T 2;
процедура добавления элемента с полем данных T в конец очереди Procedure Add_Queue(var p. End: Ptr. Rec; T: Type. Element); Var p. Aux : Ptr. Rec; Begin New(p. Aux); p. Aux^. p. Next : = Nil; p. End^. p. Next : = p. Aux; p. End^. Element : = T; Dispose(p. Aux); p. Aux : = Nil; End;
Определение наличия элементов в очереди Function Empty_Queue (p. Begin: Ptr. Rec) : Boolean; Begin Empty_Queue : = p. Begin = Nil; End;
Удаление компоненты из очереди
Выборка компоненты T : = p. Begin^. Element; {запомним информационное поле первого элемента очереди} p. Begin : = p. Begin^. p. Next; {переопределим ссылку на новый первый элемент}
Procedure Del_Queue(var p. Begin: Ptr. Rec; var T: Type. Element); Var p. Aux : Ptr. Rec; Begin If p. Begin = Nil Then Writeln ('Попытка удаления из пустой очереди!') Else Begin T : = p. Begin^. Element; p. Aux : = p. Begin; {запомним предполагаемый "мусор"} p. Begin : = p. Begin^. p. Next; p. Aux^. p. Next : = Nil; {здесь ссылка не нужна} Dispose(p. Aux); {удалим "мусор"} p. Aux : = Nil; End;
Основные отличия линейного списка от стека и очереди для чтения доступна любая компонента списка; новые компоненты можно добавлять в любое место списка; при чтении компонента не удаляется из списка.


