Скачать презентацию Полустатические структуры данных они имеют переменную Скачать презентацию Полустатические структуры данных они имеют переменную

Полустатические структуры данных.pptx

  • Количество слайдов: 46

Полустатические структуры данных Полустатические структуры данных

 они имеют переменную длину и простые процедуры ее изменения; изменение длины структуры происходит они имеют переменную длину и простые процедуры ее изменения; изменение длины структуры происходит в определенных пределах, не превышая какого-то максимального (предельного) значения

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

Основные операции над стеком включение нового элемента (английское название push - заталкивать) исключение элемента Основные операции над стеком включение нового элемента (английское название push - заталкивать) исключение элемента из стека (англ. pop – выскакивать)

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

 Type Ptr. Rec = ^Rec; Rec = Record Element : Type. Element; {информационное 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; формирование стека и добавление нового элемента 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. 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. Aux^. p. Next : = p. Top;

 Переместим указатель на вершину стека p. Top на новое сформированное звено p. Aux: Переместим указатель на вершину стека p. Top на новое сформированное звено p. Aux: p. Top : = p. Aux;

 В информационное поле новой вершины поместим значение D 2: p. Top^. Element : В информационное поле новой вершины поместим значение D 2: p. Top^. Element : = D 2;

процедура добавления элемента с информационным полем D в стек: Procedure Add_Stack(var p. Top: Ptr. процедура добавления элемента с информационным полем 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. процедура добавления в стек новой компоненты 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. процедура построения стека на основе процедуры добавления в стек новой компоненты 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; Чтение данных из вершины стека D : = p. Top^. Element;

Вспомогательная переменная p. Aux позволит избавиться от Вспомогательная переменная p. Aux позволит избавиться от "мусора" p. Aux : = p. Top;

 изменяет значение указателя на вершину стека p. Top : = p. Aux^. p. изменяет значение указателя на вершину стека p. Top : = p. Aux^. p. Next;

 удалить ненужную ссылку p. Aux^. p. Next : = Nil; удалить ненужную ссылку p. Aux^. p. Next : = Nil;

освобождение динамической области памяти Dispose (p. Aux); p. Aux : = Nil; освобождение динамической области памяти Dispose (p. Aux); p. Aux : = Nil;

процедура удаления из стека элемента с информационным полем D: Procedure Del_Stack(var p. Top: Ptr. процедура удаления из стека элемента с информационным полем 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. Просмотр информационного поля вершины стека 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 Определение наличия элементов в стеке 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. Получение копии стека 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 Очередью FIFO (First - In - First- Out - "первым пришел - первым исключается"). называется такой последовательный список с переменной длиной, в котором включение элементов выполняется только с одной стороны списка (эту сторону часто называют концом или хвостом очереди), а исключение - с другой стороны (называемой началом или головой очереди). Те самые очереди к прилавкам и к кассам, которые мы так не любим, являются типичным бытовым примером очереди FIFO

Основные операции над очередью начальное формирование очереди (запись первой компоненты); добавление компоненты в конец Основные операции над очередью начальное формирование очереди (запись первой компоненты); добавление компоненты в конец очереди; определение первого элемента в очереди с последующим извлечением его из очереди.

Описание компоненты очереди Type Ptr. Rec = ^Rec; Rec = Record Element : Type. Описание компоненты очереди 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 Начальное формирование очереди 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. процедура формирования очеред 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); добавление компоненты в конец очереди New(p. Aux);

Ссылка нового звена на следующий элемент очереди не определена p. Aux^. p. Next : Ссылка нового звена на следующий элемент очереди не определена p. Aux^. p. Next : = Nil;

Последний элемент очереди должен ссылаться на новое звено p. End^. p. Next : = Последний элемент очереди должен ссылаться на новое звено p. End^. p. Next : = p. Aux;

Указатель на последний элемент очереди передвигаем p. End : = p. Aux; Указатель на последний элемент очереди передвигаем p. End : = p. Aux;

 p. End^. Element : = T 2; p. End^. Element : = T 2;

процедура добавления элемента с полем данных T в конец очереди Procedure Add_Queue(var p. End: процедура добавления элемента с полем данных 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 Определение наличия элементов в очереди Function Empty_Queue (p. Begin: Ptr. Rec) : Boolean; Begin Empty_Queue : = p. Begin = Nil; End;

Удаление компоненты из очереди Удаление компоненты из очереди

Выборка компоненты T : = p. Begin^. Element; {запомним информационное поле первого элемента очереди} Выборка компоненты 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 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;

Основные отличия линейного списка от стека и очереди для чтения доступна любая компонента списка; Основные отличия линейного списка от стека и очереди для чтения доступна любая компонента списка; новые компоненты можно добавлять в любое место списка; при чтении компонента не удаляется из списка.