Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Библиотека / ЛЕКЦИИ / Линейные структуры данных.DOC
Скачиваний:
48
Добавлен:
23.03.2015
Размер:
310.27 Кб
Скачать

4)Стек на базе массива

size body

TopInd

rep

size

TopIndвершина

2

1

type

T=<описание типаТ>

stack_T=record

size:word

TopInd:word

Pbody:^body;

end;

Body=array[1..65536 div sizeof(T)] of T;

{stack_T=data type is Create,Push,Pop,IsEmpty,Done}

Описание: Stack_T - это изменяемые стеки элементов типа Т.Операции Push и Pop изменяют состояние стека.

Procedure Create (Var S:Stack_T; size_stask:word);

requires 0sizeStask65535 div sizeof(T)

effects создают пустой стек элементов типа Т с размером в sizeStask элементов типа Т

Procedure Push (Var S:Stask_T;X:T);

requires S - содержит меньше элементов,чем S.size

modifies S

effects вталкивает элемент Xв стекS

Proceddure Pop (Var S:Stask_T);

requires S - непустой

modifies S

effects выталкивает элемент из вершины стека

Function Top (S:Stask_T):T;

requires S - непустой

effects возвращает элемент , находящийся в вершине стека .

Function IsEmpty (S:Stask_T):boolean;

effects IsEmpty=S=пустой стек

Proceddure Done (Var S:Stask_T);

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

IMPLEMENTATION

{ Функция абстракции:

Типичный стек есть последовательность элементов e1,e2,…,en,где n - вуршина стека (т.е. стек растет в строку старших индексов массива pBody).

Функция инвариант представления:

1size65535 div sizeof(T) & 0TopIndsize & PBody^[TopInd] - элемент в вершине стека. Pbody указывает на вектор памяти размером sizesizeof(T)}

Procedure Create;

BEGIN

if sizeStasksizeof(T)>65536 then halt(1);

GetMem(S.Pbody,sizeStasksizeof(T));

S.TopInd: =0;

S.Size: =sizeStask;

END;

Procedure Push;

BEGIN

inc(S.TopInd);

S.Pbody^[S.TopInd]: =X;

END