|
Этот способ можно считать "родным" для стека
как линейной динамической структуры. Приводим тексты
соответствующих процедур на языке Pascal.
{-------------------------------------------------}
{ Линейный однонаправленный список }
{-------------------------------------------------}
type PElem = ^TElem;
TElem = record
Data : <item>;
Next : PElem;
end;
var
Head : PElem; {Указатель на голову стека}
{-------------------------------------------------}
{ LIFO Добавление элемента в стек }
{-------------------------------------------------}
procedure Push (TheData : <item>);
var
NewElem : PElem;
begin
New(NewElem);
NewElem^.Data := TheData;
NewElem^.Next := Head;
Head := NewElem;
end;
{--------------------------------------------------}
{ LIFO Извлечение элемента из стека }
{--------------------------------------------------}
function Pop (var TheData : <item>) : boolean;
{true - верхний элемент извлечен; false - стек пуст}
var
TempElem : PElem;
begin
TempElem := Head;
if TempElem = nil then begin
Pop := false;
exit;
end;
Head := Head ^.Next;
TheData := TempElem^.Data;
Dispose (TempElem);
Pop := true;
end;
{-------------------------------------------------}
{ LIFO Выборка верхнего элемента без удаления }
{-------------------------------------------------}
function StackTop (var TheData : <item>) : boolean;
{true - верхний элемент прочтен; false - стек пуст}
begin
if Head = nil then begin
StackTop := false;
exit;
end;
TheData := Head^.Data;
StackTop := true;
end;
{-------------------------------------------------}
Если в приведенном выше описании в качестве
типа item указать char, то
процедура размещения в новом пустом стеке символьной строки
(входного выражения) выглядит так:
{-------------------------------------------------}
{ LIFO Формирование стека из входной строки }
{-------------------------------------------------}
procedure MakeStack (var Head : PElem);
var
TempElem : PElem;
InputData : string;
i : 0..255;
begin {исходный стек пуст}
Head := nil;
<ввод строки InputData>
if Length(InputData) = 0 then exit;
for i:=1 to Length (InputData) do begin
TempElem := Head;
New (Head);
Head^.Data := InputData[i];
Head^.Next := TempElem;
end;
end;
|