Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответ программирование1.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
295 Кб
Скачать
☆

Процедуры работы с динамической памятью

Модуль System

Procedure Dispose(var P: Pointer);

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

После вызова Dispose значение P не определено. При включенной директиве {$I+}, вы можете использовать исключительные ситуации, чтобы обработать эту ошибку.

 

Procedure FreeMem(var P: Pointer [; Size: Integer]);

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

P - переменная любого типа-указателя, предварительно созданная процедурой GetMem.

Size определяет размер динамической переменной в байтах. Для корректной работы этой процедуры, Size должно быть точно равно числу байтов, предварительно распределенных для этой переменной процедурой GetMem.

FreeMem уничтожает переменную P и возвращает память «куче». Если P не указывает на память в «куче», возникает ошибка времени выполнения.

После вызова FreeMem, значение P не определено, и происходит ошибка, если Вы впоследствии ссылаетесь на P^. Вы можете использовать исключительные ситуации, чтобы обработать эту ошибку.

 

Procedure GetMem(var P: Pointer; Size: Integer);

GetMem создает динамическую переменную определенного размера и помещает адрес блока в переменную Р.

P - переменная любого типа-указателя. Size - выражение, определяющее размер в байтах динамической переменной. Вы должны ссылаться на созданную переменную как P^.

 

Procedure New(var P: Pointer);

Создает новую динамическую переменную и помещает ее адрес в переменную Р. P - переменная любого типа-указателя. Размер распределенного блока памяти равен размеру типа, на который указывает P. Если памяти недостаточно, чтобы распределить динамическую переменную, возникает исключительная ситуация EOutOfMemory.

При завершении программы, все динамические переменные, созданные процедурами New или GetMem, должны быть уничтожены соответственно процедурами Dispose или FreeMem.

37. Стек. Добавление и выборка элемента из стека. Стеки Pascal-Паскаль

Линейные списки, в которых операции вставки, удаления и доступа к значениям выполняются в первом или последнем узле, получили следующие названия:

  1. Стек - особый вид списка, обращение к которому идет только через указатель на первый элемент. Если в стек нужно добавить элемент, то он добавляется впереди первого элемента, при этом указатель на начало стека переключается на новый элемент. Алгоритм работы со стеком характеризуется правилом: «последним пришел - первым вышел» (LIFO, last in - first out).

  2. Очередь - это вид списка, имеющего два указателя на первый и последний элемент цепочки. Новые элементы записываются вслед за последним, а выборка элементов идет с первого. Этот алгоритм типа «первым пришел - первым вышел» (FIFO, first in - first out).

  3. Дек или двусторонняя очередь - это линейный список, в котором все операции вставки и удаления (и, как правило, операции доступа к данным) выполняются на обоих концах списка.

Стеки

Интуитивными моделями стека могут служить колода карт на столе при игре в покер, стопка тарелок на полке буфета; во всех этих моделях взять можно только верхний предмет, а добавить новый объект можно, только положив его на верхний. Стеки также иногда называют «магазинами» по аналогии с магазином патронов, в этом случае патрон, помещенный в магазин первым, выстреливает последним.

Механизм работы стека можно представить, если воспользоваться аналогией с железнодорожным разъездом, которая предложена Э. Дейкстрой. Сейчас Вы познакомитесь с одной из разновидностей обычного линейного списка – стеком. Этот вид списка очень часто используется в программировании.

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

Стек часто называют структурой LIFO (сокращение LIFO означает Last In – First Out, т.е. последним пришел – первым вышел). Это сокращение помогает запомнить механизм работы стека.

Изобразим стек графически:

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

Стек предполагает вставку и удаление элементов, поэтому он является динамической, постоянно меняющейся структурой.

Стеки довольно часто встречаются в практической жизни. Простой пример: детская пирамидка. Процесс ее сборки и разборки подобен процессу функционирования стека.

Итак, стек – это такой список, добавление или извлечение элементов которого происходит с начала и только с начала (или, возможно, с конца и только с конца) списка.

Значением указателя, представляющего стек, является ссылка на вершину стека, и каждый элемент стека содержит поле ссылки на соседний, "нижний" элемент.

Таким образом, описать стек можно следующим образом:

Type   EXST = ^ST;   ST = record        Data : integer;        Next : EXST;   end; Var   Stack : EXST; {Текущая переменная}

Если стек пуст, то значение указателя равно Nil.

Рассмотрим возможные операции со стеком.