4)Стек на базе массива
size body
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 0sizeStask65535 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).
Функция инвариант представления:
1size65535 div sizeof(T) & 0TopIndsize & PBody^[TopInd] - элемент в вершине стека. Pbody указывает на вектор памяти размером sizesizeof(T)}
Procedure Create;
BEGIN
if sizeStasksizeof(T)>65536 then halt(1);
GetMem(S.Pbody,sizeStasksizeof(T));
S.TopInd: =0;
S.Size: =sizeStask;
END;
Procedure Push;
BEGIN
inc(S.TopInd);
S.Pbody^[S.TopInd]: =X;
END